【codevs1295 N皇后问题(不输出方案)】回溯法
2016-11-13 08:27
513 查看
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n, C[15], tot = 0; void search(int cur) { if (cur == n) tot++; else for (int i = 0; i < n; i++) { int ok = 1; C[cur] = i; //尝试把cur行的皇后放在第i列 for (int 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) search(cur + 1); } } int main() { scanf("%d", &n); search(0); printf("%d\n", tot); return 0; }
第一种,用一维数组实现。
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; int vis[3][30], n, tot = 0, C[30]; void search (int cur) { if (cur == n) { tot++; } else for (int 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; search(cur + 1); vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0; } } } int main() { //memset(vis, 0, sizeof(vis)); scanf("%d", &n); search(0); printf("%d\n", tot); return 0; }
第二种,用二维数组实现。之前WA了很久的原因是数组开小了!!!!!
vis[1][cur + i]这里cur和i都可能到n,所以数组至少要开2n辣么大qnq
【做2194的时候要把从0存的数组改成从1开始存嘛,然后改了第一种就WA了!!!调了一晚上也没调出来!!我也不知道为什么qnq蓝后就放弃了。。。。。】
【search函数是紫书上的代码】
相关文章推荐
- 【codevs1295 N皇后问题(不输出方案)】回溯法
- 【codevs2194 N皇后(输出方案)】回溯法
- CODE[VS] 1295 N皇后问题
- 深度优先搜索 之 CODE[VS] 1295 N皇后问题
- Codevs 1295 N皇后问题
- code【vs】1295 N皇后问题(dfs(回溯))
- 【题解】 状态压缩 CSYZOJ 1040 || codevs 1295 || hdu 2553 N皇后问题
- 【codevs1295】 N皇后问题
- codevs N皇后问题 回溯法
- Codevs P1295 N皇后问题
- 【DFS】CODE[VS] 1295 N皇后问题(刷题记录)
- CodeVS 1295 N皇后问题 题解
- 【题解】 状态压缩 CSYZOJ 1040 || codevs 1295 || hdu 2553 N皇后问题
- 从零开始的暴搜复习生活—DFS(CODE[VS] 1116 四色问题 1294 全排列 1295 N皇后问题)
- CODE[VS] 1295 N皇后问题
- codevs1295 N皇后问题 解题报告
- CODE[VS] 1295 N皇后问题
- Code[VS] 1295 Nqueens N皇后问题
- codevs1295N皇后问题
- codevs 3162 抄书问题 (dp+枚举输出位置)