n皇后问题
来源:互联网 发布:mac怎么用u盘装双系统 编辑:程序博客网 时间:2024/05/16 19:23
【题目】N皇后问题(含八皇后问题的扩展,规则同八皇后):在N*N的棋盘上,放置N个皇后,要求每一横行每一列,每一对角线上均只能放置一个皇后,问可能的方案及方案数。
代码1:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<stack> using namespace std; #define N 15 int n; //皇后个数 int sum = 0; //可行解个数 int x[N]; //皇后放置的列数stack<int> S;stack<int> tmp; int place(int k) { int i; for(i=1;i<k;i++) if(abs(k-i)==abs(x[k]-x[i]) || x[k] == x[i]) return 0; return 1; } int queen(int t) { if(t>n && n>0) //当放置的皇后超过n时,可行解个数加1,此时n必须大于0 { sum++; while(!tmp.empty()) tmp.pop(); while(!S.empty()) { tmp.push(S.top()); S.pop(); } while(!tmp.empty()) { printf("%d ",tmp.top()); S.push(tmp.top()); tmp.pop(); } printf("\n"); } else for(int i=1;i<=n;i++) { x[t] = i; //标明第t个皇后放在第i列 if(place(t)) //如果可以放在某一位置,则继续放下一皇后 { S.push(i); queen(t+1);S.pop(); } } return sum; } int main() { while(scanf("%d",&n)!=EOF) { int t=0; sum=0; memset(x,0,sizeof(x));t = queen(1); if(n == 0) //如果n=0,则可行解个数为0,这种情况一定不要忽略 t = 0; printf("%d\n",t); } return 0; }
代码2:
#include<iostream>#include<stdio.h>#include<string.h>#include<stack>using namespace std;const int maxx=100;int visit[maxx][maxx];int fig;int n;stack<int> S;stack<int> tmp;void dfs(int i,int j){ if(visit[i][j]==0) { S.push(j); if(i==n) { while(!tmp.empty()) tmp.pop(); while(!S.empty()) { tmp.push(S.top()); S.pop(); } while(!tmp.empty()) { printf("%d ",tmp.top()); S.push(tmp.top()); tmp.pop(); } printf("\n"); fig++; S.pop(); return ; } int k; visit[i][j]++; for(k=1; k<=n; k++) { if(k!=i) visit[k][j]++; if(k!=j) visit[i][k]++; } k=1; while(j-k>=1&&i-k>=1) { visit[i-k][j-k]++; k++; } k=1; while(i+k<=n&&j+k<=n) { visit[i+k][j+k]++; k++; } k=1; while(i-k>=1&&j+k<=n) { visit[i-k][j+k]++; k++; } k=1; while(i+k<=n&&j-k>=1) { visit[i+k][j-k]++; k++; } for(int g=1; g<=n; g++) { dfs(i+1,g); } S.pop(); visit[i][j]--; for(k=1; k<=n; k++) { if(k!=i) visit[k][j]--; if(k!=j) visit[i][k]--; } k=1; while(j-k>=1&&i-k>=1) { visit[i-k][j-k]--; k++; } k=1; while(i+k<=n&&j+k<=n) { visit[i+k][j+k]--; k++; } k=1; while(i-k>=1&&j+k<=n) { visit[i-k][j+k]--; k++; } k=1; while(i+k<=n&&j-k>=1) { visit[i+k][j-k]--; k++; } }}int main(){ while(scanf("%d",&n)!=EOF) { if(n==0) break; memset(visit,0,sizeof(visit)); while(!S.empty()) S.pop(); fig=0; for(int i=1; i<=n; i++) { dfs(1,i); } printf("%d\n",fig); } return 0;}
- N*N皇后问题
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- N皇后问题
- n皇后问题
- N皇后问题
- N 皇后问题
- N皇后问题
- N皇后问题算法
- N 皇后问题
- N皇后问题
- N皇后问题
- n皇后问题
- N皇后问题
- N皇后问题优化
- N皇后问题
- n皇后问题
- N皇后问题
- 11个Visual Studio调试小技巧
- gdb调试死锁线程
- javascript 和 css 常见不兼容的处理
- 编译ios版openssl(2013/01/28)
- hdu2012——素数判定解题报告
- n皇后问题
- 面试中遇到的问题
- 过程挖掘(Process Mining Manifesto):从日志中挖掘知识
- Struts2第一天总结
- 1041. Be Unique
- 建立ubuntu nfs 服务器
- windows学习笔记二
- Android JSON解析
- 类型擦除