AcWing 1621 N 皇后问题

Posted 霜序0.2℃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 1621 N 皇后问题相关的知识,希望对你有一定的参考价值。

题目

NN 皇后问题是指将 NN 个皇后放置在 N×NN×N 棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

在本题中,你无需解决这一难题。

你需要做的是判断我们给出的棋子摆放是否是一种合理的摆放方案,即是否能够满足皇后之间不能相互攻击到。

为了简化棋盘的表示,让我们假设在同一列中不会放置两个皇后。

这样我们就可以用一个整数序列 Q1,Q2,…,QNQ1,Q2,…,QN 来表示一种棋盘摆放,其中 QiQi 表示第 ii 列的皇后所在的行号。

例如,下方左图的棋盘摆放可以用 (4, 6, 8, 2, 7, 1, 3, 5) 来表示,它是解决八皇后问题的一种合理摆放方案。

下方右图的棋盘摆放可以用 (4, 6, 7, 2, 8, 1, 9, 5, 3) 来表示,它并不是解决九皇后问题的一种合理摆放方案。

输入格式

第一行包含整数 KK,表示共有 KK 组测试数据。

每组测试数据占一行,首先包含整数 NN,然后包含 NN 个整数 Q1,Q2,…,QNQ1,Q2,…,QN。

输出格式

对于每组数据,如果是合理摆放方案,则输出 YES,否则输出 NO

每个答案占一行。

数据范围

1<K≤2001<K≤200,
4≤N≤10004≤N≤1000
1≤Qi≤N1≤Qi≤N

输入样例:

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

解释与代码

我用了一个set来判断是不是每行都只有一个,最后判断数量即可
然后由于对角线的性质,一条是相加和相同,一条是相减差相同,判断即可

时间复杂度O(n^2),再加上K的200

以前其实没怎么接触n皇后,学长讲过,但是没写过,虽然这道只是判断,但是既然写了就发个题解吧

C++ 代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <iostream>
#include <sstream>
#include <set>
#include <map>
#include <queue>
#include <bitset>
#include <vector>
#include <limits.h>
#include <assert.h>
#include <functional>
#include <numeric>
#include <ctime>
#define endl        '\\n'
#define ini(a)      memset(a,0,sizeof(a))
#define ini2(a,b)   memset(a,b,sizeof(a))
#define case        ll T;read(T);for(ll Q=1;Q<=T;Q++)


using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double PI    = acos(-1.0);
const double eps   = 1e-6;
const int    INF   = 0x3f3f3f3f;
const ll     LLINF = 0x3f3f3f3f3f3f3f3f;
const int    maxn  = 50009;
const ll     N     = 5;

int arr[1099];
set<int> si;

void solve(){
    si.clear();
    int q, flag = 0;
    cin>>q;
    for (int i=1; i<=q; i++) {
        cin>>arr[i];
        si.insert(arr[i]);
    }
    if (si.size() != q) {
        cout<<"NO"<<endl;
        return ;
    }
    for (int i=1; i<=q && flag==0; i++) {
        int p = i - arr[i], o = i + arr[i];
        for (int j=1; j<=q && flag==0; j++) {
            if (j == i) continue;
            if (j - arr[j] == p || j + arr[j] == o) {
                cout<<"NO"<<endl;
                return ;
            }
        }
    }
    cout<<"YES"<<endl;
}

int main()
{
    case{solve();}
}

以上是关于AcWing 1621 N 皇后问题的主要内容,如果未能解决你的问题,请参考以下文章

Acwing 843. n-皇后问题

AcWing 843. n-皇后问题(DFS)

DFS+剪枝Aw842.排列数 & Aw843.N-皇后问题

843. n-皇后问题

n-皇后问题

对八皇后的补充以及自己解决2n皇后问题代码