前面的解法要给非法位置赋值,不如直接判断是否是合法位置,合法就填,这样更清晰。哪种效率高就不知道了
#define N 8
#define true 1
#define false 0
int a[N][N]={{0}}; //0表示没有放棋但还可能放,1表示放下
int num_of_jie=0;
void queen(int row,int n) //处理某一行
{
int check(int ,int ,int );
int i,j;
if (row==n) { //输出
for(i=0;i<n;i++) {
for(j=0;j<n ;j++ )
if(a[i][j]!=1)
printf("0");
else
printf("1");
printf("\n");
}
printf("\n");
num_of_jie++;
}
else
for (i=0;i<n ;i++ )
{
if(check(row,i,n)) {
a[row][i]=1; //通过检查,放棋
queen(row+1,n); //递归处理下一行
a[row][i]=0; //恢复这颗棋子的位置为空
}
}
}
int check(int row,int col,int n)
{
int i;
for(i=1;(row-i)>=0;i++)
if(a[row-i][col]==1) return false;
for(i=1;((row-i)>=0)&&((col-i)>=0);i++)
if(a[row-i][col-i]==1) return false;
for(i=1;((row-i)>=0)&&((col+i)<n);i++)
if(a[row-i][col+i]==1) return false;
return true;
}
int main()
{
queen(0,N);
printf("\n共有%d组解\n",num_of_jie);
return 0;
}
|
阅读(313) | 评论(0) | 转发(0) |