1 条题解
-
0
每列随便放,最后再检查,评测机够快就过了
#include <bits/stdc++.h> using namespace std; int tot = 0; // 记录当前有了几个方案 int ans[10]; // ans[i] 记录第 i 列放在了第 ans[i] 行 // 前 now-1 列放好了,考虑第 now 列放在第几行 void dfs(int now) { if (now == 9) { bool flag = true; // 前 8 列放好了之后就检查 // (ans[1],1) (ans[2],2) (ans[3],3) for (int i = 1; i <= 8; i++) for (int j = i + 1; j <= 8; j++) { // 检查 (ans[i],i) 与 (ans[j],j) 是否冲突 if (ans[i] == ans[j] || i == j || ans[i] - i == ans[j] - j || ans[i] + i == ans[j] + j) { flag = false; break; } } if (flag) { // 找到了一个新方案 tot++; cout << "No. " << tot << "\n"; for (int i = 1; i <= 8; i++) { for (int j = 1; j <= 8; j++) if (i == ans[j]) cout << 1 << " "; else cout << 0 << " "; cout << "\n"; } } return; } for (int i = 1; i <= 8; i++) { ans[now] = i; dfs(now + 1); ans[now] = 0; } } int main() { ios::sync_with_stdio(false); cin.tie(0); dfs(1); // 从第一列开始考虑 return 0; }
每次放之前先检查一下,跑得飞快
#include <bits/stdc++.h> using namespace std; int tot = 0; // 记录当前有了几个方案 int ans[10]; // ans[i] 记录第 i 列放在了第 ans[i] 行 // 前 now-1 列放好了,考虑第 now 列放在第几行 void dfs(int now) { if (now == 9) { // 找到了一个新方案 tot++; cout << "No. " << tot << "\n"; for (int i = 1; i <= 8; i++) { for (int j = 1; j <= 8; j++) if (i == ans[j]) cout << 1 << " "; else cout << 0 << " "; cout << "\n"; } return; } for (int i = 1; i <= 8; i++) { // 放之前先检查和前面放的是否冲突 // 当前想要放在 (i,now) // 检查与 (ans[j],j) 是否冲突 bool flag = true; for (int j = 1; j < now; j++) { if (i == ans[j] || now == j || i + now == ans[j] + j || i - now == ans[j] - j) { flag = false; break; } } if (flag) { ans[now] = i; dfs(now + 1); ans[now] = 0; } } } int main() { ios::sync_with_stdio(false); cin.tie(0); dfs(1); // 从第一列开始考虑 return 0; }
- 1
信息
- ID
- 433
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 104
- 已通过
- 35
- 上传者