看题目应该是传说中的N皇后问题,当年学算法课的时候一直转不过弯的黑历史
原题如下
题目大意
只需要判断给出的棋盘排列是否是N皇后的解(即每一个皇后都不能在同一行、同一列、同一斜行。为了简单考虑,没有两个皇后被放在同一列,然后给出每一列皇后所在的行数(1-N)。
输入:
一共给出K个样例,每一个样例的格式为:
N
Q
1
Q
2
.
.
.
Q
N
N Q_1 Q_2 ... Q_N
NQ1Q2...QN
输出:
若是N皇后的解输出“YES”,否则输出“NO”。
自己的想法
首先每一行不能相同,且列 i − j ≠ r o w i − r o w j i-j\ne row_i -row_j i−j̸=rowi−rowj,若满足则输出“YES"否则"NO"。
答案反馈
错误1
这种题也能错?
我发现当两行相等时,我还没输入完就break了??
for (int i = 0; i < n; i++) {
cin >> row[i];
if (flag[row[i]] == true) {
flag_1 = 1;
//break;错误的地方
}
flag[row[i]] = true;
}
我怕不是个傻子
AC
AC代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<cmath>
#include<vector>
#include<cstdlib>
#include<set>
#include<queue>
#include<map>
#include<stack>
using namespace std;
const int maxn = 1010;
int flag[maxn];
int row[maxn];
int main() {
#ifdef test
freopen("input.txt", "r", stdin);
#endif
int k;
cin >> k;
while (k--) {
int n;
cin >> n;
fill(row, row + maxn, 0);
fill(flag, flag + maxn, false);
int flag_1 = 0;
for (int i = 0; i < n; i++) {
cin >> row[i];
if (flag[row[i]] == true) {
flag_1 = 1;
//break;
}
flag[row[i]] = true;
}
if (flag_1)cout << "NO" << endl;
else {
int flag_2 = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (row[i]==row[j]||abs(i - j) == abs(row[i] - row[j])) {
flag_2 = 1; break;
}
}
if (flag_2)break;
}
if (flag_2)cout << "NO" << endl;
else cout << "YES" << endl;
}
}
return 0;
}
结语
仔细仔细再仔细!!!!