八皇后问题
来源:互联网 发布:新版淘宝客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;}
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题(2)
- 八皇后问题(3)
- 八皇后问题
- 八皇后问题程序
- 浅谈八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题求解
- 八皇后问题
- 八皇后问题
- 八皇后问题
- Delphi RegisterHotKey 设置系统热键
- 黑马程序员--ADO.NET数据导入导出
- 字符串编码(charset, encoding/decoding)问题原理
- javax.servlet.http.HttpServletRequest对对地址栏地址信息的解析
- 生成mpx文件下载,解析mpp文件上传
- 八皇后问题
- struts2自定义分页标签
- JavaScript字符串函数大全
- C# 实现下载(四法)
- URL 编码
- ubuntu下安装opencv(用apt安装)
- 常用的几个网络DOS命令
- Linux文件查找命令find,xargs详述
- 线程与进程的区别