1 solutions

  • 0
    @ 2024-12-27 17:46:03

    算法分析

    每一行,按照列搜索,列搜索完了,就搜索到下一行,搜索完所有行以后即找到正确的答案。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=10;
    char g[N][N];
    bool row[N][N],col[N][N],cell[3][3][N]; 
    //row[x][i]=true表示第x行填了数i,cell[i][j][x]表示第i行第j列的小格子填了数x
    bool dfs(int x,int y)
    {
        if(y==9) x++,y=0; //行已经到了结尾
        if(x==9) //搜索完成
        {
            for(int i=0;i<9;i++)
            {
                cout<<g[i]<<endl;
            }
            return true;
        }
        if(g[x][y]!='.') return dfs(x,y+1); //如果已经有数,就搜索下一列
        for(int i=0;i<9;i++) //枚举当前格子需要填写的数
        {
            if(!row[x][i]&&!col[y][i]&&!cell[x/3][y/3][i])
            {
                g[x][y]=i+'1';
                row[x][i]=col[y][i]=cell[x/3][y/3][i]=true;
                if(dfs(x,y+1)) return true;
                row[x][i]=col[y][i]=cell[x/3][y/3][i]=false;
                g[x][y]='.';
            }
        }
        return false; //找不到
    }
    int main()
    {
    
        for(int i=0;i<9;i++)
        {
            cin>>g[i];
            for(int j=0;j<9;j++)
            {
                if(g[i][j]!='.') //对于已经有了的数进行标记
                {
                    int t=g[i][j]-'1';
                    row[i][t]=col[j][t]=cell[i/3][j/3][t]=true;
                }
            }
        }
    
        dfs(0,0);
        return 0;
    }
    
    • 1

    Information

    ID
    2131
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    (None)
    # Submissions
    12
    Accepted
    3
    Uploaded By