关键:1.递归,换新行时,一列一列的试探能否摆皇后。
2.三个数组标记限制能否摆皇后。
a[col]=1;//一维数组a[col]=1代表:chess二维数组 第col列有皇后
b[row+col]=1;//代表:chess二维数组 坐标和为row+col的右斜线
c[row-col+queueNum-1]=1;//代表:chess二维数组 和为row+col的左斜线
#include<stdio.h>
#include<iostream>
using namespace std;
#define queueNum 8
int chess[queueNum][queueNum]={0};
int a[queueNum],b[2*queueNum-1],c[2*queueNum-1];//下标0~14共15个元素
int sum=0; //统计所有摆法
void PutQueen(int row) {//从第row行放皇后
int col,i,j;
for(col=0;col<queueNum;col++) {
if(!a[col]&& !b[row+col] && !c[row-col+queueNum-1]) { //判断安全位置
chess[row][col]=1;//1代表放置皇后 //放置皇后
a[col]=1;//一维数组a[col]=1代表:chess二维数组 第col列有皇后
b[row+col]=1;//代表:chess二维数组 坐标和为row+col的右斜线
c[row-col+queueNum-1]=1;//代表:chess二维数组 和为row+col的左斜线
if(row<queueNum-1) { //“0~queueNum-2”行递归调到“queueNum-1”行 停止
PutQueen(row+1);
}else {//调到“queueNum-1”行 停止,输出
sum++;
printf("第%d种可能的摆法:\n",sum); //输出皇后摆法
for(i=0;i<queueNum;i++){
printf("\t\t");//第i行从2个tab键开始输出
for(j=0;j<queueNum;j++)
printf("%d ",chess[i][j]);
printf("\n");
}
printf("\n");
if(sum%10==0) { //每输出十种暂停
printf("按回车键继续……");
getchar();
}
}
chess[row][col]=0; //取消皇后,为了下次另一种摆法。
b[row+col]=0;
c[row-col+queueNum-1]=0;
a[col]=0;
}
}
}
int main() {
int i;
printf("%d皇后问题答案 输出开始 \n",queueNum);
PutQueen(0);
printf("%d皇后摆法总数: %d\n",queueNum,sum);
system("pause");
return 0;
}