Sudoku Killer--hdu1426(数独 跟上一题差不多 但是输入时问题)

http://acm.hdu.edu.cn/showproblem.php?pid=1426

 

注意输入问题就行

还是dfs

#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[N][N],v1[N][N],v2[N][N],v3[N][N];
int ok=0,sum;

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

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+1][i]==0)
            {
                v1[e[p].x][i]=1;
                v2[e[p].y][i]=1;
                v3[e[p].x/3*3+e[p].y/3+1][i]=1;
                a[e[p].x][e[p].y]=i;

                DFS(p+1);

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

}

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

        flag=1;
        k=0;
        sum=0;
        ok=0;
        b=0;
        memset(a,0);
        memset(v1,0);
        memset(v2,0);
        memset(v3,0);

    }
    return 0;
}

 

posted @ 2016-04-11 13:43  啦咯  阅读(249)  评论(0编辑  收藏  举报