// queen.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"


int array[8][8] = {0};
int count = 0;


void SetQueenInLine( int );
void SetQueen( int Xline, int Yline );
int UpDownClear( int Xline, int Yline );
int SlashIsClear( int Xline, int Yline  );
void PrintMap();




/*
主函数只调用SetQueenInLine函数 在函数内部实现嵌套调用 对每行进行判断放置Queen的位置
*/
int main(int argc, char* argv[])
{
SetQueenInLine( count );
getchar();
return 0;
}




/*
函数主体 逐一判断该行的每个x坐标 其竖线和斜线上有无冲突 如果有的话跳出 没有的话放置Queen 并自调用进入下一行判断
且判断每到第八行完成放置 打印棋盘
*/
void SetQueenInLine( int Xline )
{
int Yline = 0;
for( ; Yline < 8; Yline++ )
{
if( UpDownClear( Xline, Yline ) )
if( SlashIsClear( Xline, Yline ) )
{
SetQueen( Xline, Yline );
if( Yline < 8 )
{
SetQueenInLine( Xline +1 );
}
else
{
PrintMap();
}

}
else
continue;
else 
continue;
}
// 每行进行到最后对上一行标记清空

for( int i = 0; i < 8 ; i ++ )
{
array[Xline-1][i] = 0;
}

}




/*
放置Queen的函数 对应数组位置写1
*/
void SetQueen( int Xline, int Yline )
{
array[Xline][Yline] = 1;
}


/*
判断该列是否冲突 冲突返回0 否则返回1
*/
int UpDownClear( int Xline, int Yline )
{
for( int tmp = 0; tmp < Xline; tmp++ )
{
if( array[tmp][Yline] == 1 )
return 0;
}
return 1;
}


/*
判断斜线是否冲突 包括左斜线和右斜线 冲突返回0 否则返回1
*/
int SlashIsClear( int Xline, int Yline  )
{
int tmpx, tmpy; //左斜线
tmpx = Xline;
tmpy = Yline;
while( ( tmpx > 0 ) & ( tmpy > 0 ) )
{
if( array[--tmpx][--tmpy] == 1 )
return 0;
}


tmpx = Xline; //右斜线
tmpy = Yline;
while( ( tmpx > 0 ) & ( tmpy < 8 ) )
{
if( array[--tmpx][++tmpy] == 1 )
return 0;
}


return 1;
}


/*
打印棋盘
*/
void PrintMap()
{
for( int i = 0; i < 8; i++ )
{
for( int j = 0; j < 8; j++ )
{
if( array[i][j] )
{
printf(" Q");
}
else
printf(" *");
}
printf("\n");
}
printf("\n");


}