任务描述
本关任务:假设已放了8个皇后的棋盘(在每列、每行上只有一个皇后,且一条斜线上也只有一个皇后)。用回溯法解8个皇后问题的全部解。
编程要求
定义函数Try(i),用来试探放第i行上的皇后。
讨论将第i行上的皇后放在j列位置上的安全性,可以逐行地放每一个皇后,在做这一步时,第i行上还没有皇后,不会在行上遭到其他皇后的攻击。只考虑来自列和对角线的攻击。定义q(i)=j表示第i行上的皇后放在第j列,一旦这样做了,就要考虑第i个皇后所在的列不安全了,让C[j]=false,同时,要考虑通过(i,j)位置的两条对角线也不安全了,得出从左上到右下的对角线上的每个位置都有“i-j=常数”的特点;从左下到右上的对角线上的每个位置都有“i+j=常数”的特点。得出在(i,j)位置放皇后的安全条件为
nq=C[j]&&L[i-j+9]&&R[i,j]
假如,C[j],L[k], R[m]为布尔型
测试说明
平台会对你编写的代码进行测试:
预期输出:
92
C语言实现
#include<stdio.h>
#include<math.h>
int resultCount=0;//记录解的个数
int n=0;//皇后个数
int result[1000]={0};
int Place(int t){
int re=1;
//判断与前面的t-1个皇后位置是否冲突
for(int i=0;i<t;i++){
if(result[t]==result[i]||t-i==fabs(result[t]-result[i])){
re=0;
break;
}
}
return re;
}
void Backtrack(int t){
if(t>=n){
resultCount++;
//打印解
// for(int i=0;i<n;i++){
// printf("%d ",result[i]);
// }
// printf("\n");
// printf("_______\n");
}else{
//求第t个皇后的可能行的位置
for(int i=0;i<n;i++){
result[t]=i;
if(Place(t)){
Backtrack(t+1);
}
}
}
}
int main(void) {
//皇后个数为n
n=8;
Backtrack(0);//从零层开始递归
//输出解
printf("%d",resultCount);
return 0;
}