题解 | #Sudoku#

Sudoku

https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1

#include <iostream>
using namespace std;
#include<map>
int a[9][9];
bool Sudu(pair<int,int> b[],int n,int s)
{
    bool m[10];
    int r,l;
    for(int i=0;i<10;i++)
    {
        m[i]=false;
    }
    for(int i=0;i<9;i++)
    {
        m[a[b[n].first][i]]=true;
    }
    for(int i=0;i<9;i++)
    {
        m[a[i][b[n].second]]=true;
    }
    r=((b[n].first)/3)*3;
    l=((b[n].second)/3)*3;
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            m[a[r+i][l+j]]=true;
        }
    }
    for(int i=1;i<10;i++)
    {
        if(m[i]==false)
        {
            a[b[n].first][b[n].second]=i;
            if(n==s) return true;
            else
            {
                if(Sudu(b,n+1,s)) return true;
                //a[b[n].first][b[n].second]=0;
            }
         
        }
    }
    a[b[n].first][b[n].second]=0;
    return false;
}
int main() {
    pair<int,int> b[81];
    int n=0;
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
            cin>>a[i][j];
            if(a[i][j]==0)
            {
                b[n].first=i;
                b[n].second=j;
                n++;
            }
        }
    }
    Sudu(b,0,n-1);
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<9;j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }

}
// 64 位输出请用 printf("%lld")

#2022届毕业生现状#
全部评论
递归回溯,找到空缺位0,每次找到空缺位可填数字尝试填入递归进入下一个空缺位如果本轮没有合适的数字填入则空缺位置为0返回上一层。直到所有空缺位都填入可行数字递归结束
点赞 回复 分享
发布于 2023-03-05 20:40 重庆

相关推荐

不愿透露姓名的神秘牛友
07-10 11:33
点赞 评论 收藏
分享
头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务