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;
- 对角线的特点: