PAT甲級1128 N Queens Puzzle (20分) 判重

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

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

就是皇后問題判重,判斷行重複 對角線重複就好,我寫代碼時候寫多了個判斷列重複,題目已經很明確說了列不會重複。注意的點有

  • 題目給的位置標示好難受,從左下角數,我還是變成了左上角開始的數組
  • 然後關於對角重複判斷,直接行標-列標就能得到一個 對角元素都一樣的值,比如從主對角線的元素 行標減列標都是0了
  • 判重最快還是開個N個元素的數組,默認爲0, 有元素了就是1,沒有就是0
  • 對於行標減去列標 進行對角線判重的話,使用#include <unordered_set> 可以

代碼:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_set>
using namespace std;

int main()
{
    int K;
    cin>>K;


    for(int k=0; k<K; k++)
    {
        unordered_set<int> sett;

        int sign=1;
        int N;
        cin>>N;
        int setRow[N+1]={0};
        int setCol[N+1]={0};
        int sn[N+1][N+1]= {0};
        for(int n=1; n<=N; n++)
        {
            //n是從左下角數的 第幾列
            int m;
            cin>>m;
            //m是第幾行
            //這表示好難受,
            int trueRow=N+1-m;
            int trueCol=N+1-n;
            sn[trueRow][trueCol]=1;


            int get=trueRow-trueCol;
            if(sett.find(trueRow-trueCol)==sett.end())
                sett.insert(trueRow-trueCol);
            else
            {
                sign=0;
            }

            if(setRow[trueRow]==0)
                setRow[trueRow]=1;
            else
            {
                sign=0;
            }
            if(setCol[trueCol]==0)
                setCol[trueCol]=1;
            else
            {
                sign=0;
            }
        }
        if(sign==1)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }


    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章