UESTC 1222 Sudoku

爆搜即可

/* ***********************************************
author        :
email         :523689985@qq.com
created time  :2015/12/1 15:46:23
file name     :main.cpp
************************************************ */

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int maxn=10;
int r[maxn][maxn],c[maxn][maxn],q[maxn][maxn];
int T;
char Map[maxn][maxn];
int ans[maxn][maxn];
int Qx[maxn*maxn],Qy[maxn*maxn];
int tot;
int flag;

int F(int x,int y)
{
    if(x==0||x==1)
    {
        if(y<=1) return 0;
        else return 1;
    }
    else
    {
        if(y<=1) return 2;
        else return 3;
    }
}

void dfs(int Now)
{
    if(Now==tot)
    {
        flag=1;
        return;
    }
    int nowX=Qx[Now];
    int nowY=Qy[Now];
    for(int i=1;i<=4;i++)
    {
        if(r[nowX][i]==0&&c[nowY][i]==0&&q[F(nowX,nowY)][i]==0)
        {
            r[nowX][i]=c[nowY][i]=q[F(nowX,nowY)][i]=1;
            ans[nowX][nowY]=i;
            dfs(Now+1);
            if(flag) return;
            r[nowX][i]=c[nowY][i]=q[F(nowX,nowY)][i]=0;
        }
    }
}

int main()
{
    scanf("%d",&T);
    for(int Case=1;Case<=T;Case++)
    {
        memset(r,0,sizeof r);
        memset(c,0,sizeof c);
        memset(q,0,sizeof q);    
        tot=0; flag=0;    
        for(int i=0;i<4;i++) scanf("%s",Map[i]);
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            {
                if(Map[i][j]=='*') 
                {
                    ans[i][j]=-1;
                    Qx[tot]=i;
                    Qy[tot]=j;
                    tot++;
                }
                else
                {
                    ans[i][j]=Map[i][j]-'0';
                    r[i][ans[i][j]]=1;
                    c[j][ans[i][j]]=1;
                    q[F(i,j)][ans[i][j]]=1;
                }
            }
        }
        flag=0;    
        dfs(0);
        printf("Case #%d:
",Case);
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
                printf("%d",ans[i][j]);
            printf("
");
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5010932.html