八皇后问题

来源:互联网 发布:新版淘宝客pid查询 编辑:程序博客网 时间:2024/05/15 23:45

八皇后问题

问题描述:

在棋盘上放置8个皇后,使得他们互不攻击,此时每个皇后的攻击范围为同行同列和同对角线,要求找出所有的解,如图所示:

Q           Q          Q     Q    Q           Q  Q         Q    

分析:

不难发现恰好每行每列各位置放置一变成了个皇后。如果用C[x]表示第x行皇后的列编号,则问题全排列生成问题。

代码:

#include <iostream>using namespace std;#define N 100int n,tot,C[N];void seach(int cur){int i,j;if(cur==n)          //递归边界 tot++;else for(i=0;i<n;i++){int ok=1;C[cur]=i;           // 尝试把第cur行的皇后放在第j列 for(j=0;j<cur;j++)  //检查是否和前面的皇后冲突  if(C[cur]==C[j]||cur-C[cur]==j-C[j]||cur+C[cur]==j+C[j]){ok=0;break;}if(ok) seach(cur+1); }}int main(int argc, char *argv[]){cin>>n;memset(C,0,sizeof(C));seach(0);cout<<tot<<endl;return 0;}


 

法2:回溯法

#include <iostream>using namespace std;#define N 100int n,tot,C[N],vis[N][N];void seach(int cur){int i,j;if(cur==n)          //递归边界 tot++;else for(i=0;i<n;i++){if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n]) //利用数组判断 {C[cur]=i;vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;seach(cur+1);vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;}} }int main(int argc, char *argv[]){cin>>n;memset(C,0,sizeof(C));memset(vis,0,sizeof(vis));seach(0);cout<<tot<<endl;return 0;}