我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805348915855360
题目描述:
题目翻译:
1128 N皇后问题
“八皇后问题”是将8个国际象棋皇后放置在8×8棋盘上的问题,使得不会有两个皇后相互威胁。因此,解决方案要求没有两个皇后共享相同的行,列或对角线。八皇后问题是在N×N棋盘上放置N个互不攻击的皇后的更一般的N皇后问题的一个例子。(来自维基百科——“Eight queens puzzle”。)
本题,你不需要解决该难题。相反,你需要判断棋盘的给定摆放位置是否是解决方案。为了简化棋盘的表示,我们假设没有两个皇后将被放置在同一列中。然后,摆放位置可以由简单的整数序列(Q1, Q2, ⋯, QN),其中Qi是第i列皇后的行坐标。例如,图1可以用(4, 6, 8, 2, 7, 1, 3, 5)表示,它确实是8皇后问题的解决方案;而图2可以用(4, 6, 7, 2, 8, 1, 9, 5, 3)表示,却不是9皇后问题的解决方案。
输入格式:
每个输入文件包含一个测试用例。每个测试用例第一行给出一个正整数K(1 < K <= 200)。紧跟着K行,每行以形式“N Q1 Q2 ... QN” 给出一种解决方案,其中4 <= N <= 100,且题目保证所有的Qi(i = 1, 2, ..., N)满足1 <= Qi <= N。所有数字由一个空格分隔。
输出格式:
对每个解决方案,如果其实N皇后问题的正确解,输出“YES”,否则输出“NO”。
输入样例:
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
输出样例:
YES
NO
NO
YES
思路:所有皇后不能出现在对角线上也不能出现在同一行上
C++代码:
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
bool isSolution(vector<int> nums); //判断给出的N皇后解决方案是否正确
int main(){
int K;
scanf("%d", &K);
vector<int> nums;
int num;
for(int i = 0; i < K; i++){
nums.clear();
int N;
scanf("%d", &N);
for(int j = 0; j < N; j++){
scanf("%d", &num);
nums.push_back(num);
}
if(isSolution(nums)){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
bool isSolution(vector<int> nums){
for(int i = 0; i < nums.size(); i++){
for(int j = i + 1; j < nums.size(); j++){
if(nums[i] == nums[j] || abs(i - j) == abs(nums[i] - nums[j])){ //如果两个皇后出现的同一行或出现在对角线,说明不正确
return false;
}
}
}
return true;
}
C++解题报告: