八皇后问题
来源:互联网 发布:三体 死神永生 知乎 编辑:程序博客网 时间:2024/06/05 09:27
#include <iostream>#include <cstring>using namespace std;const int maxNum = 1005;// 解的数目int tot = 0;// cur:行数 C[cur]:列数int C[maxNum];// 皇后总数int n;void search1(int cur) { // 递归边界 // 可以输出一个C[n]数组 // 该数组即为一个解 if(cur == n) { tot++; } else { for(int i = 0; i < n; i++) { int ok = 1; // 尝试把第cur行的皇后放在第i列上 C[cur] = i; // 检查是否和前面的皇后有冲突 for(int j = 0; j < cur; j++) { // C[cur] == C[j] 同一列 // cur - C[cur] == j - C[j] 同一主对角线 // cur + C[cur] == j + C[j] 同一副对角巷 if(C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j]) { ok = 0; break; } } if(ok) { search1(cur + 1); } } }}int vis[3][maxNum];void search2(int cur) { // 递归边界 if(cur == n) { tot++; } else { for(int i = 0; i < n; i++) { // 点(cur, i)的列,副对角,主对角是否已有其他皇后 // 主对角y - x的时候可能为负,所以+n // cur 代表行 i 代表列 if(!vis[0][i] && !vis[1][cur + i] && !vis[2][cur - i + n]) { C[cur] = i; // 将点(cur,i)的列,副对角,主对角置为已访问 vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 1; // 递归访问 search2(cur + 1); // 回溯 vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0; } } }}int main() { while(cin >> n) { // 初始化 tot = 0; memset(vis, 0, sizeof(vis));// search1(0); search2(0); cout << "总解数:" << tot << endl; } return 0;}
1 0
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题(2)
- 八皇后问题(3)
- 八皇后问题
- 八皇后问题程序
- 浅谈八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题求解
- 八皇后问题
- 八皇后问题
- 八皇后问题
- android-项目目录的详细介绍
- grivade刷新success
- 大小端模式
- shell学习-特殊变量
- (Android studio)关于drawable文件夹的问题
- 八皇后问题
- 枚举enum
- error: `cout' was not declared in this scope
- 各类排序算法总结
- 在eclipse上配置maven
- Spark函数讲解:combineByKey
- JQuery之attr与prop
- 关于在服务器上发布网站遇到的两个问题之解决方案
- NYoj_104最大和