算法實踐:數獨(0)

數獨(0)

描述

在這裏插入圖片描述

輸入

輸入的記憶碎片A是一個9行9列的數獨矩陣。

每行包含9個數字(均不超過數字爲1-9)。

初始矩陣A:

530070000

600195000

098000060

800060003

400803001

700020006

060000280

000419005

000080079

輸出

如果輸入數據真的是初始矩陣A的解,輸出Yes,否則輸出No

輸入樣例

534678912
672195348
198342567
859761423
426853791
713924856
961537284
287419635
345286179

輸出樣例

yes

解法

判斷成立的條件:

1)輸入的數字與原數獨數字非空的部分要完全相同,且爲1-9

2)每一行每一列每一個小方格不重複

不能把每一行每一列加起來得到的數值比較(1+2+…+9=45)

代碼

#include<bits/stdc++.h>
using namespace std;
char a[10][10]={
    {"530070000"},
    {"600195000"},
    {"098000060"},
    {"800060003"}, 
    {"400803001"},
    {"700020006"},
    {"060000280"},
    {"000419005"},
    {"000080079"}
};
char b[10][10];
bool check1(){
    string aline;
    for(int i=0;i<9;i++){
        cin>>aline;
        if(aline.size()!=9){
            // !cout<<"wrong line";
            return false;
        }
        for(int j=0;j<9;j++){
            b[i][j] = aline[j]-'0';
            if(b[i][j]<1 || b[i][j]>9 || (b[i][j]!=(a[i][j]-'0') && (a[i][j]-'0')!=0) ){
                // cout<<"wrong digit";
                return false;
            }
        }
    }
    return true;
}
bool check2(){
    bool isUsed[10];
    //判斷每行是不是重複
    for(int i=0;i<9;i++){
        // for(int j=0;j<10;j++) isUsed[j]=false;
        memset(isUsed,false,sizeof(isUsed));
        for(int j=0;j<9;j++){
            if(isUsed[b[i][j]]==true) return false;
            else  isUsed[b[i][j]]=true;
        }
    }
    // 判斷每列是不是重複
    for(int i=0;i<9;i++){
        // for(int j=0;j<10;j++) isUsed[j]=false;
        memset(isUsed,false,sizeof(isUsed));
        for(int j=0;j<9;j++){
            if(isUsed[b[j][i]]==true) return false;
            else  isUsed[b[j][i]]=true;
        }
    }
    //判斷小方格是不是重複
    bool isused[3][3];
    for(int i=0;i<9;i+=3)
        for(int j=0;j<9;j+=3){
            memset(isused,false,sizeof(isused));
            for(int i1=0;i1<3;i1++)
                for(int j1=0;j1<3;j1++){
                    if(isused[i1][j1]==true) return false;
                    else isused[i1][j1]=true;
                }
        }
    return true;
}
int main()
{
    if(check1()&&check2()) 
        cout<<"Yes";
    else cout<<"No";
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章