乐趣区

关于c++:PAT甲级1128-N-Queens-Puzzle

题目粗心

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

算法思路

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

提交后果

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;
}
退出移动版