HDU- 1426-Sudoku Killer

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

 

 

#include<iostream>
#include<string>
using namespace std;

const int maxn = 12;
int map[maxn][maxn];
bool row_used[maxn][maxn];//所在行
bool low_used[maxn][maxn];//所在列
//int xy_used[maxn][maxn];
int flag;

struct Node
{
    bool a[10];
}xy_used[4][4];

void Make_set()
{
    memset(row_used, false, sizeof(row_used));
    memset(low_used, false, sizeof(low_used));
    memset(xy_used, false, sizeof(xy_used));
}

void dfs(int k) 
{
    if(k > 81) {  //遍历到矩阵外表示已经找到解了
        flag = 1;  //标记已找到
        for(int i=1; i<=9; i++) {
            for(int j=1; j<9; j++) {
                printf("%d ", map[i][j]);
            }
            printf("%d\n", map[i][9]);
        }
        return ;
    }
    if(flag == 0)  //找到一种解就不再找别的解了,因为只有一种解
    {
        int x = (k-1)/9+1; //
        int y = (k-1)%9+1; //
        k++;

        if(map[x][y] == 0)  //此格需要填数字
        {
            for(int i=1; i<=9; i++)
            {
                if(!row_used[x][i] && !low_used[i][y] && !xy_used[(x-1)/3+1][(y-1)/3+1].a[i])
                {
                    row_used[x][i]=true;
                    low_used[i][y]=true;
                    xy_used[(x-1)/3+1][(y-1)/3+1].a[i]=true;
                    map[x][y] = i;

                    dfs(k);

                    map[x][y] = 0;
                    row_used[x][i]=false;
                    low_used[i][y]=false;
                    xy_used[(x-1)/3+1][(y-1)/3+1].a[i]=false;
                }
            }
        }
        else
            dfs(k);  //不需要即跳过寻找下一个
    }
}

int main()
{
    char c[3];
    int i, j;
    int a;
    int k = 1;
    while(cin>>c)
    {
        Make_set();

        if(c[0] == '?')
            map[1][1] = 0;
        else
        {
            a = map[1][1] = c[0] - '0';
            row_used[1][a]=true;
            low_used[a][1]=true;
            xy_used[1][1].a[a] = true;
        }
        for(i=2; i<=9; i++) {
            scanf("%s", c);
            if(c[0] == '?')
                map[1][i] = 0;
            else
            {
                a = map[1][i] = c[0] - '0';
                row_used[1][a]=true;
                low_used[a][i]=true;
                xy_used[1][(i-1)/3+1].a[a] = true;
            }
        }
        for(i=2; i<=9; i++) {
            for(j=1; j<=9; j++)    {
                scanf("%s", c);
                if(c[0] == '?')
                    map[i][j] = 0;
                else
                {
                    a = map[i][j] = c[0] - '0';
                    row_used[i][a]=true;
                    low_used[a][j]=true;
                    xy_used[(i-1)/3+1][(j-1)/3+1].a[a] = true;
                }
            }
        }
        if(k++ > 1)
            printf("\n");

        flag = 0;
        
        dfs(1);
    }
    return 0;
}


/*
3 ? ? ? ? 4 ? ? ?
? ? 7 2 ? ? ? ? 5
? 6 5 3 ? ? ? ? 4
? 5 3 9 ? 2 ? ? ?
? 7 ? 1 0 0 3 9 ?
8 ? 9 ? ? ? 5 4 1
? 1 2 8 ? 9 ? 7 ?
? ? ? ? ? ? ? ? 9
5 ? ? ? ? ? 8 ? 6

7 1 2 ? 6 ? 3 5 8
? 6 5 2 ? 7 1 ? 4
? ? 8 5 1 3 6 7 2
9 2 4 ? 5 6 ? 3 7
5 ? 6 ? ? ? 2 4 1
1 ? 3 7 2 ? 9 ? 5
? ? 1 9 7 5 4 8 6
6 ? 7 8 3 ? 5 1 9
8 5 9 ? 4 ? ? 2 3

? 6 ? ? ? ? ? ? 2
? ? ? ? 8 ? ? ? ?
? ? ? 1 3 ? ? ? ?
? 4 ? ? ? 7 ? ? ?
? ? ? ? 9 ? ? 3 8
? 2 ? ? ? ? 5 ? ?
? ? ? ? ? 2 ? ? 4
1 ? ? ? ? ? ? ? ?
3 ? ? ? ? ? ? 8 ?

3 8 1 5 9 4 6 2 7
9 4 7 2 6 8 1 3 5
2 6 5 3 7 1 9 8 4
1 5 3 9 4 2 7 6 8
4 7 6 1 8 5 3 9 2
8 2 9 6 3 7 5 4 1
6 1 2 8 5 9 4 7 3
7 3 8 4 1 6 2 5 9
5 9 4 7 2 3 8 1 6

7 1 2 4 6 9 3 5 8
3 6 5 2 8 7 1 9 4
4 9 8 5 1 3 6 7 2
9 2 4 1 5 6 8 3 7
5 7 6 3 9 8 2 4 1
1 8 3 7 2 4 9 6 5
2 3 1 9 7 5 4 8 6
6 4 7 8 3 2 5 1 9
8 5 9 6 4 1 7 2 3

4 6 8 7 5 9 3 1 2
7 3 1 2 8 6 4 9 5
2 9 5 1 3 4 8 7 6
5 4 3 8 2 7 9 6 1
6 1 7 4 9 5 2 3 8
8 2 9 6 1 3 5 4 7
9 8 6 3 7 2 1 5 4
1 5 4 9 6 8 7 2 3
3 7 2 5 4 1 6 8 0

*/

 

posted @ 2012-09-13 11:01  另Ⅰ中Feel▂  阅读(176)  评论(0编辑  收藏  举报