1128 N Queens Puzzle (20 分)
-
题目大意:"eight queens puzzle"的问题是将8个棋子放到一个8x8的棋盘上,使得每个亲自的行、列、对角线上都没有其他棋子。我们需要判断给出的棋局是否解决了eight queens puzzle,为了简化棋盘,我们假设每列没有重复的棋子,然后给出每列棋子所在的行数。
-
思路:
-
判断行:
v[j] == v[i](原来的思路:用一个hash表存每行的棋子数,若某行已经有棋子的话,说明该棋盘不符合条件,但是这样的话要设置很大的数组)
-
判断列对角线:
abs(v[j] - v[i]) == j - i;(一开始老是想用hash存对角线是否被占用,但我搞不清怎么算对角线,最简单的方法还是用abs(v[j] - v[i]) == j - i;)
-
-
知识点:
- 对角线的特点:
abs[v[j] - v[i]] == j - i;
- 对角线的特点:
-
代码:
#include <iostream> #include <vector> #include <cmath> using namespace std; int main() { int k, n; scanf("%d", &k); for(int i = 0; i < k; i++){ scanf("%d", &n); vector<int> v(n); vector<int> hash(n); for(int j = 0; j < n; j++) scanf("%d", &v[j]); bool flag = false; for(int p = 0; p < n; p++){ for(int q = p + 1; q < n; q++){ if(v[q] == v[p] || abs(v[q] - v[p]) == q - p){ printf("NO\n"); flag = true; break; } } if(flag) break; } if(!flag) printf("YES\n"); } return 0; } -
总结:
- 对角线的特点:
abs[v[j] - v[i]] == j - i;
- 对角线的特点:

本文介绍了如何通过简化八皇后问题来判断一个棋局是否合法。核心思路是检查每行、每列以及对角线是否有重复的棋子。通过遍历棋盘,使用绝对值判断对角线上的棋子位置,当找到冲突时立即输出“NO”,否则输出“YES”。关键在于理解对角线的特性:abs(v[j]-v[i]) == j-i。

1327

被折叠的 条评论
为什么被折叠?



