题目链接:1128 N Queens Puzzle (20分)
题意
N皇后问题,简化问题,使每个皇后在不同的列,给出每列皇后所在的行号。判断是否符合N皇后规则。所有皇后在n*n棋盘中,任意两个皇后在不同行,不同列,不同对角线。
分析
依次对每一列的皇后判断是否与前面的皇后处于对角线上,在同一对角线上,停止检索,输出NO。所有都不在,检查是否每个行号都出现了。都出现了表示所有的皇后都不在同一行上。输出yes。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std;
const int maxn = 1100;
int a[maxn], book[maxn];
int main(int argc, char** argv) {
int n, t;scanf("%d", &t);while(t--) {
scanf("%d", &n);memset(book, 0, sizeof(book));int flag = 1, flag2 = 1;for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);book[a[i]] = 1;if (flag == 1)for (int j = 1; j < i; j++) {
if (abs(i - j) == abs(a[i] - a[j])) {
flag = 0;break;}}}for (int i = 1; i <= n; i++) if (book[i] == 0) {
flag2 = 0;break;}if (flag == 1 && flag2 == 1)printf("YES\n");elseprintf("NO\n");}return 0;
}