算法实践:数独(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";
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值