您的位置:首页 > 其它

八皇后问题

2012-08-22 16:14 148 查看
八皇后问题
问题描述:
在棋盘上放置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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: