hdu5547 Sudoku (暴力DFS)

题目点我点我点我
CCPC的H题,当时现场赛是连DFS都不会啊,唉o(︶︿︶)o
题目大意:数独
思路:直接暴力DFS,row[i][k]第i行数字为k的,col[i][k]第i列数字为k的。2*2的方块也必须是1234。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define inf 0x3f3f3f3f
pair<int,int>p[18];
int row[5][5],col[5][5],num,flag;  //flag控制输出及递归的结束
char s[5][5];

bool check() //2*2的方块是否都有1234
{
    if(((1<1][1])|(1<1][2])|(1<2][1])|(1<2][2]))!=30)return false;
    if(((1<1][3])|(1<1][4])|(1<2][3])|(1<2][4]))!=30)return false;
    if(((1<3][1])|(1<3][2])|(1<4][1])|(1<4][2]))!=30)return false;
    if(((1<3][3])|(1<3][4])|(1<4][3])|(1<4][4]))!=30)return false;
    return true;
}

void dfs(int cnt)
{
    if(flag)return;
    if(cnt>num)
    {
        if(check())
        {
            flag=1;  
            for(int i=1;i<=4;i++)
            {
                for(int j=1;j<=4;j++)
                {
                    s[i][j]+='0';
                     cout<<(s[i][j]);
                }
                printf("\n");
            }
        }
        return;
    }
    int x=p[cnt].first;
    int y=p[cnt].second;
    for(int i=1;i<=4;i++)
    {
        if(!row[x][i] && !col[y][i])
        {
            row[x][i]=1;
            col[y][i]=1;
            s[x][y]=i;
            dfs(cnt+1);
            row[x][i]=0;
            col[y][i]=0;
        }
    }
    if(flag)return;

}


int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int T,i,j,cas=1;
    scanf("%d",&T);
    while(T--)
    {
        memset(row,0,sizeof(row));
        memset(col,0,sizeof(col));
        num=0;
        flag=0;
        for(i=1;i<=4;i++)
        {
            for(j=1;j<=4;j++)
            {
                cin>>s[i][j];
                if(s[i][j]!='*')
                {
                    s[i][j]-='0';
                    int k=s[i][j];
                    row[i][k]=1;
                    col[j][k]=1;
                }
                else
                {
                    p[++num]=make_pair(i,j); //*的行列记录下来
                    s[i][j]-='0';

                }
            }
        }
        printf("Case #%d:\n",cas++);
        dfs(1);
    }
    return 0;
}

你可能感兴趣的:(~~~~~acm~~~~~,DFS,=====搜索=====)