1

题目大意

N皇后问题的改版,输入的每一行数据为一种棋盘摆放位置,其下标为列,值为行,保证每一列不重复,判断是否是该N皇后问题的解

算法思路

只需判断当前N个棋子是否在同一行或者对角线上,判断的方法就是在输入每一个棋子的位置的时候就去与前面的所有棋子比较其行是否一样或者判断行标之差的绝对值是否等于列表之差的绝对值,如果是说明不是N皇后的解,输出NO,否则输出YES

提交结果

图片.png

AC代码

#include <cstdio>
#include <algorithm>

using namespace std;

int main() {
    int k;
    scanf("%d",&k);
    for(int i=0;i<k;++i){
        int n;
        scanf("%d",&n);
        int solution[n+1];
        bool isAns = true;// 是否是N皇后的解
        for(int j=1;j<=n;++j){
            scanf("%d",&solution[j]);
            for(int x=1;x<j;++x){
                if(solution[j]==solution[x]||abs(j-x)==abs(solution[x]-solution[j])){
                    isAns = false;
                    break;
                }
            }
        }
        if(isAns){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }
    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得