1128 N Queens Puzzle

mac2024-07-30  57

题目大意

给出一个皇后图,以这样的方式给出:一个数组包含n个数字,每个数字表示该列的皇后所在的行数,判断给出的皇后图是否满足不会互相攻击(任意两个皇后都要不在同一行或者同一列,且不在斜对角线上)。

思路解析

第一次操作八皇后问题,见识到了对角线问题的处理方法。 用vec[n]存储一张图给出的数字~对于第j个数字,判断前0~j-1个数字中是否有在同一行的(v[j] == v[t])和在斜对角线上的(abs(v[j]-v[t]) == abs(j-t))(因为已经告诉肯定不在同一列了,所以不需要判断是否在同一列)如果发现了不满足的情况,就将flag由true标记为false,最后根据flag是true还是false输出对应的YES还是NO即可。

参考自:https://www.liuchuo.net/archives/3796 传送门


示例代码

#include<iostream> #include<vector> using namespace std; int main() { int k, n; scanf("%d", &k); for (int i = 0; i < k; i++) {//执行k次 scanf("%d", &n); vector<int> vec(n); bool flag = true; for (int j = 0; j < n; j++) { scanf("%d", &vec[j]); for (int t = 0; t < j; t++) { if (vec[t] == vec[j] || abs(vec[t] - vec[j]) == abs(t - j)) {//行数之差 == 列数之差,说明存在对角 flag = false; break; } } } cout << (flag == true ? "YES\n" : "NO\n"); } return 0; }
最新回复(0)