![]() ![]() |
题目大意
给出一个皇后图,以这样的方式给出:一个数组包含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;
}