算法思路:
1.初始化: i=1
2.初始化: j=1
3.从第一行开始,恢复j的当前值,判断低j个位置
a.位置j可放入皇后,标记位置(i,j),i++,转步骤2
b.位置j不可放入皇后,j++,转步骤a
c.当j>8时,i--,转步骤3
4.结束:
第8行有位置可放入皇后
#include<stdio.h>
#define N 8
/*模拟棋盘,加2为了判定边界*/
static char board[N + 2][N + 2];
static int count = 0;
/*定义的偏移量*/
typedef struct _tag_pos
{
int ios;
int jos;
}Pos;
static Pos pos[] = { {-1,-1},{-1,0},{-1,1}};
void display()
{
int i = 0;
int j = 0;
for (i = 0; i < N + 2; i++)
{
for (j = 0; j < N + 2; j++)
{
printf("%c", board[i][j]);
}
printf("\n");
}
}
int check(int i ,int j)
{
int ret = 1;
int p = 0;
for (p = 0; p < 3; p++)
{
int ni = i;
int nj = j;
while ((ret) && (board[ni][nj] != '#'))
{
ni = ni + pos[p].ios;
nj = nj + pos[p].jos;
ret = ret && (board[ni][nj] != '*');
}
}
return ret;
}
void find(int i)
{
int j = 0;
if (i > N)
{
count++;
printf("Soulution %d\n",count);
display();
getchar();
}
else
{
for (j = 1; j <= N; j++)
{
if (check(i, j))
{
board[i][j] = '*';
find(i + 1);
board[i][j] = ' ';
}
}
}
}
/*初始化化棋盘*/
void init()
{
int i = 0;
int j = 0;
for (i = 0; i < N + 2; i++)
{
board[0][i] = '#';
board[N + 1][i] = '#';
board[i][0] = '#';
board[i][N+1] = '#';
}
for (i = 1; i < N; i++)
{
for (j = 1; j <= N; j++)
{
board[i][j] = ' ';
}
}
}
int main()
{
init();
find(1);
return 0;
}