Sudoku---hdu2676(数独DFS)

http://poj.org/problem?id=2676

 

递归深搜 

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
#include<iostream>

using namespace std;

#define N 100
#define INF 0xffffffff
#define memset(a,b) memset(a,b,sizeof(a))

int a[15][15];

struct node
{
    int x,y;
} e[N];
int sum;

int v1[N][N],v2[N][N],v3[N][N], ok;

void DFS(int p)
{

    if(p>sum)
    {
        ok=1;
        return;
    }

    for(int i=1; i<=9; i++)
    {
        if(!ok)
            if(v1[e[p].x][i]==0 && v2[e[p].y][i]==0 && v3[(e[p].x/3)*3+e[p].y/3][i]==0)
            {
                a[e[p].x][e[p].y]=i;
                v1[e[p].x][i]=1;
                v2[e[p].y][i]=1;
                v3[(e[p].x/3)*3+e[p].y/3][i]=1;

                DFS(p+1);

                //  a[e[p].x][e[p].y]=0;
                v1[e[p].x][i]=0;
                v2[e[p].y][i]=0;
                v3[(e[p].x/3)*3+e[p].y/3][i]=0;
            }
    }
}

int main()
{
    int T;
    scanf("%d ",&T);
    while(T--)
    {
        memset(v1,0);
        memset(v2,0);
        memset(v3,0);
        ok=sum=0;
        char str[N];
        for(int i=0; i<9; i++)
        {
            scanf("%s",str);
            for(int j=0; j<9; j++)
            {
                a[i][j]=str[j]-'0';
                if(a[i][j]!=0)
                {
                    v1[i][a[i][j]]=1;
                    v2[j][a[i][j]]=1;
                    v3[(i/3)*3+j/3][a[i][j]]=1;
                }
                else
                {
                    sum++;
                    e[sum].x=i;
                    e[sum].y=j;
                }
            }
        }
        DFS(1);
        for(int i=0; i<9; i++)
        {
            for(int j=0; j<9; j++)
            {
                printf("%d",a[i][j]);
            }
            printf("\n");
        }

    }
    return 0;
}

 

posted @ 2016-04-11 12:51  啦咯  阅读(241)  评论(0编辑  收藏  举报