N 皇后问题

不难得出,一行只能放一个皇后,可以通过行索引一个皇后:某行的皇后在第几列。

索引到皇后之后,还要考虑皇后们的势力范围,按行索引的思路已经预先考虑到皇后在某行的势力了,还要设置在列、对角线和副对角线的标记记录势力范围。

一条对角线上的点的横纵坐标之和相同,一条副对角线上的点的横纵坐标之差相同。

其余的在代码注释里

#include<iostream>
int lin[50];//第i行的皇后在第 lin[i]列 
bool col[50],diag[50],secd[50];

void Queen(int x,int n,void (*ans_call)(int n,int *ans),int *ans) //按行索引 
//放置第x行的皇后 
//前x-1行已被皇后占据
{ for(int c=1;c<=n;c++) //枚举这个皇后在第几列 { if(!col[c]&&!diag[x+c]&&!secd[x-c+20])//如果此列、对角线和副对角线没有被占据则这个皇后放置在这 { lin[x]=c;//保存答案 col[c]=1;//占据此列 diag[x+c]=1;//占据此对角线 secd[x-c+20]=1;//占据此副对角线 if(x==n-1) { ans_call(n,ans);//如果最后一行的皇后放置完毕则一个答案已经出现 } else { Queen(x+1,n,ans_call,ans);//继续放置下一行的皇后 } col[c]=0;//取消占据此列 diag[x+c]=0;//取消占据此对角线 secd[x-c+20]=0;//取消占据此副对角线 } } } void answer(int n,int *ans) { for(int i=0;i<n;i++) printf("%5d",i[lin]); printf("\n"); *ans=1; } int main() { int n; std::cin>>n; int ans=0; Queen(0,n,answer,&ans); if(!ans) std::cout<<"no solute!"; }

 

posted @ 2022-08-23 15:58  nichengmeibeiyong  阅读(14)  评论(0编辑  收藏  举报