八皇后问题
2012-08-22 16:14
148 查看
八皇后问题
问题描述:
在棋盘上放置8个皇后,使得他们互不攻击,此时每个皇后的攻击范围为同行同列和同对角线,要求找出所有的解,如图所示:
分析:
不难发现恰好每行每列各位置放置一变成了个皇后。如果用C[x]表示第x行皇后的列编号,则问题全排列生成问题。
代码:
法2:回溯法
问题描述:
在棋盘上放置8个皇后,使得他们互不攻击,此时每个皇后的攻击范围为同行同列和同对角线,要求找出所有的解,如图所示:
Q | |||||||
Q | |||||||
Q | |||||||
Q | |||||||
Q | |||||||
Q | |||||||
Q | |||||||
Q |
不难发现恰好每行每列各位置放置一变成了个皇后。如果用C[x]表示第x行皇后的列编号,则问题全排列生成问题。
代码:
#include <iostream> using namespace std; #define N 100 int n,tot,C ; 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 100 int n,tot,C ,vis ; 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; }