PAT A1128 N Queens Puzzle
Sample Input:
4
8 4 6 8 2 7 1 3 5
9 4 6 7 2 8 1 9 5 3
6 1 5 2 6 4 3
5 1 3 5 2 4
Sample Output:
YES
NO
NO
YES
-
思路 1:
判断给出数组是否满足N皇后:从前向后遍历即可,枚举数组中的每对元素,由于肯定不在同一行,只需判断是否在同一列(y1 == y2)
或对角线(abs(x1-x2) == abs(y1-y2))
-
code 1:
#include <iostream>
using namespace std;
const int maxn = 1010;
bool judge(int x1, int y1, int x2, int y2, int n){
if(y1 == y2 || abs(x1-x2) == abs(y1-y2)) return false;
if(y1 > n || y2 > n || y1 < 1 || y2 < 1) return false;
else return true;
}
void nQueen(int n, int a[]){
bool flag = false;
for(int i = 1; i <= n; ++i){
for(int j = i+1; j <= n; ++j){
if(judge(i, a[i], j, a[j], n) == false){
flag = true;
break;
}
}
}
printf("%s", flag ? "NO\n" : "YES\n");
}
int main(){
int n, N, input[maxn];
scanf("%d", &n);
for(int i = 0; i < n; ++i){
scanf("%d", &N);
for(int j = 1; j <= N; ++j) scanf("%d", &input[j]);
nQueen(N, input);
}
return 0;
}
- T2 code:暴力法
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int num[maxn];
bool Judge(int x1, int y1, int x2, int y2){
if(y1 == y2 || abs(x1 - x2) == abs(y1 - y2)) return false;
return true;
}
bool Solve(int n){
for(int i = 1; i <= n; ++i){
for(int j = i + 1; j <= n; ++j){
if(Judge(i, num[i], j, num[j]) == false) return false;
}
}
return true;
}
int main(){
int n, k;
scanf("%d", &n);
for(int i = 0; i < n; ++i){
scanf("%d", &k);
for(int j = 1; j <= k; ++j){
scanf("%d", &num[j]);
}
printf("%s\n", Solve(k) ? "YES" : "NO");
}
return 0;
}
- T3 code: 枚举法
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int num[maxn];
bool Judge(int x1, int x2)
{
if(num[x1] == num[x2] || abs(num[x1] - num[x2]) == abs(x1 - x2)) return false;
return true;
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i)
{
int nq;
scanf("%d", &nq);
bool flg = true;
for(int j = 1; j <= nq; ++j)
{
scanf("%d", &num[j]);
if(flg)
{
for(int k = 1; k < j; ++k)
{
if(Judge(k, j) == false)
{
printf("NO\n");
flg = false;
break;
}
}
}
}
if(flg) printf("YES\n");
}
return 0;
}
- T4 code:
#include <bits/stdc++.h>
using namespace std;
vector<int> num;
bool Judge(int x1, int y1, int x2, int y2)
{
if(y1 == y2 || abs(x1-x2) == abs(y1-y2)) return false;
return true;
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i)
{
int nq;
scanf("%d", &nq);
num.resize(nq+1);
bool lock = true;
for(int j = 1; j <= nq; ++j)
{
scanf("%d", &num[j]);
for(int k = j-1; k > 0 && lock; --k)
{
if(Judge(k, num[k], j, num[j]) == false)
{
printf("NO\n");
lock = false;
break;
}
}
}
if(lock) printf("YES\n");
}
return 0;
}