Gym - 100947B 八皇后變形題

題意:就是八皇后問題的變形,給你八個(gè)皇后的位置,問是否滿足八皇后的擺放.
注: 任意皇后可以攻擊同一行,同一列,同一對(duì)角線的其他皇后.

思路: 直接判斷所輸入的位置是否沖突就可以了,即判斷是否后面輸入與前面同行,同列或同對(duì)角線. 所以用4個(gè)數(shù)組分別標(biāo)記下每一個(gè)位置看是否沖突就行了.

代碼如下:

#include<cstdio>
void check()
{
    int flag=1;
    int a[10]={0},b[10]={0},c[25]={0},d[25]={0};
    char ch[5];
    for(int i=0;i<8;i++){
        scanf("%s",ch);
        int x=ch[0]-'A'+1;
        int y=ch[1]-'0';
        if(a[x])  flag=0;//這兩個(gè)判斷是否有同行或同列
        if(b[y])  flag=0;
        if(c[x+y])  flag=0;//判斷是否有同負(fù)對(duì)角線
        if(d[x-y+10])  flag=0;//判斷是否有同正對(duì)角線,為了防止出現(xiàn)負(fù)數(shù),所以需要加一個(gè)數(shù).
        a[x]=1,b[y]=1;
        c[x+y]=1,d[x-y+10];
    }//flag=1,即所有的點(diǎn)都不同行同列或同對(duì)角線,即符合八皇后擺放.
    if(flag)    printf("Valid\n");
    else printf("Invalid\n");
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        check();
    }
}

再附上擺放8皇后的代碼: (可以推廣到n皇后)

#include<cstdio>
#include<cmath>
#include<algorithm>
const int N=8;
int a[10];  //a[i]存的是放在第i行的皇后的列的坐標(biāo).
//我們的思想是每一行放一個(gè)皇后. 然后遞歸下去放皇后.
bool check(int *a,int n)  //這個(gè)是關(guān)鍵.
{
    for(int i=2;i<=n;i++){
        for(int j=1;j<=i-1;j++){
            if(a[i]==a[j] || (abs(a[i]-a[j]) == abs(i-j)))
                return false;
        }
    }
    return true;
}
int flag=0;
void Queen8(int k)
{
    if(flag) return ;
    if(k>N){
        for(int i=1;i<=N;i++){
            printf("(%d,%d)\n",i,a[i]);
        }
        flag=1;  //只打印一種情況.
        return ;
    }
    for(int i=1;i<=N;i++){
        a[k]=i;
        if(check(a,k))   //如果不沖突,遞歸擺放下一個(gè)皇后.
            Queen8(k+1);
    }
    return ;
}

int main()
{
    Queen8(1);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容