/* 2014.03.11 8皇后问题 使用递归操作方法 */
#include <stdio.h> // 8 * 8 皇后问题
#include <stdlib.h>
#define N 8
typedef struct _tag_Pos
{
int ios;
int jos;
}Pos;
static count = 0;
static Pos pos[] = { {-1,-1}, {-1,0}, {-1,1}}; //定义的三个方向变量 方便调用
static char board[N+2][N+2];
void init() //建立数学模型 初始化数据
{
int i;
int j;
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+1;i++)
{
for(j=1;j<N+1;j++)
{
board[i][j]= ' ';
}
}
}
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 s = 0;
for(s=0;s<3;s++)
{
int ni = i;
int nj = j;
while(ret && ( board[ni][nj] != '#')) //检测数组不为 # 排除边界问题
{
ni = ni + pos[s].ios;
nj = nj + pos[s].jos;
ret = ret && (board[ni][nj] != '*'); //合法检测
}
}
return ret; // ret 的值为 1 或者为 0
}
void find(int i)
{
int j =0;
if( i > N )
{
count++;
printf("The solution is : %d\n",count);
display();
}
else
{
for(j=1;j<=N;j++)
{
if(check(i,j)) //如果判断合法
{
board[i][j] = '*'; // 赋值
find(i+1); //跳到下一行
board[i][j] = ' '; // 底层开始赋值 本行其他元素赋值为空
}
}
}
}
int main()
{
init(); //初始化数组
// display();
find(1); //找出数据
return 0;
}
#include <stdio.h> // 8 * 8 皇后问题
#include <stdlib.h>
#define N 8
typedef struct _tag_Pos
{
int ios;
int jos;
}Pos;
static count = 0;
static Pos pos[] = { {-1,-1}, {-1,0}, {-1,1}}; //定义的三个方向变量 方便调用
static char board[N+2][N+2];
void init() //建立数学模型 初始化数据
{
int i;
int j;
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+1;i++)
{
for(j=1;j<N+1;j++)
{
board[i][j]= ' ';
}
}
}
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 s = 0;
for(s=0;s<3;s++)
{
int ni = i;
int nj = j;
while(ret && ( board[ni][nj] != '#')) //检测数组不为 # 排除边界问题
{
ni = ni + pos[s].ios;
nj = nj + pos[s].jos;
ret = ret && (board[ni][nj] != '*'); //合法检测
}
}
return ret; // ret 的值为 1 或者为 0
}
void find(int i)
{
int j =0;
if( i > N )
{
count++;
printf("The solution is : %d\n",count);
display();
}
else
{
for(j=1;j<=N;j++)
{
if(check(i,j)) //如果判断合法
{
board[i][j] = '*'; // 赋值
find(i+1); //跳到下一行
board[i][j] = ' '; // 底层开始赋值 本行其他元素赋值为空
}
}
}
}
int main()
{
init(); //初始化数组
// display();
find(1); //找出数据
return 0;
}