题目链接https://pintia.cn/problem-sets/994805342720868352/problems/994805348915855360
题目大意:八皇后问题。给出K
个例子,每个例子棋盘有N
行N
列,每列只有一个皇后。判断每个例子是否满足皇后之间不共享行、列、对角线。
思路:遍历就行。但第一次做的时候居然最后一个点超时了。。。我看了看和柳神的代码思路没有几乎区别啊。唯一的区别是判断是否在同一行时,我使用了一个数组known[]
来记录某个行是否被皇后占住了,因为我觉得查询known[]
只需要常数时间,但遍历之前皇后的行要花费O(N)
时间,照理讲应该我快呀。难道给数组known[]
赋值花的时间很多吗。。。求指点
bool Judge() {
bool flag = true;
int N;
scanf("%d", &N);
vector<int> queen(N+1);
vector<bool> known(N+1, false);
for (int c = 1; c <= N; c++) {
int r;
scanf("%d", &r);
queen[c] = r;
if (!known[r])
known[r] = true;
else {
flag = false;
break;
}
for (int j = 1; j < c; j++) {
if (abs(c-j) == abs(queen[c] - queen[j])) {
flag = false;
break;
}
}
}
return flag;
}
换成和柳神一样的判断方法就过了。。。
bool Judge() {
bool flag = true;
int N;
scanf("%d", &N);
vector<int> queen(N+1);
for (int c = 1; c <= N; c++) {
int r;
scanf("%d", &r);
queen[c] = r;
for (int j = 1; j < c; j++) {
if (queen[c] == queen[j] || abs(c-j) == abs(queen[c] - queen[j])) {
flag = false;
break;
}
}
}
return flag;
}
完整代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
using namespace std;
bool Judge() {
bool flag = true;
int N;
scanf("%d", &N);
vector<int> queen(N+1);
for (int c = 1; c <= N; c++) {
int r;
scanf("%d", &r);
queen[c] = r;
for (int j = 1; j < c; j++) {
if (queen[c] == queen[j] || abs(c-j) == abs(queen[c] - queen[j])) {
flag = false;
break;
}
}
}
return flag;
}
int main() {
int K;
scanf("%d", &K);
for (int i = 0; i < K; i++) {
if (Judge())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}