您的位置:首页 > 其它

[HDU 1426] Sudoku Killer 数独

2015-08-11 19:49 435 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1426

题意:数独,每行,每列,每个3*3的小矩形里面都不能出现重复的数字。

思路:暴力搜搜搜。。

[code]#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

bool flag;
int mapn[9][9];//状态
//分别表示行,列,3*3的小矩阵中那些数字出现过。
bool visn[9][10], vism[9][10], visx[3][3][10];

int Dfs(int pos)
{
    if(flag || pos == 81){
        flag = true;
        return 0;
    }
    int x = pos / 9;
    int y = pos % 9;
    if(mapn[x][y]){  //已经有值
        Dfs(pos+1);
        return 0;
    }
    for(int i = 1; i <= 9; i++){
        if(!flag && !visn[x][i] && !vism[y][i] && !visx[x/3][y/3][i]){
            mapn[x][y] = i;
            visn[x][i] = vism[y][i] = visx[x/3][y/3][i] = true;
            Dfs(pos+1);
            if(!flag)
                mapn[x][y] = 0;
            visn[x][i] = vism[y][i] = visx[x/3][y/3][i] = false;
        }
    }
    return 0;
}

int main()
{
    char str[5];
    bool backs = false;
    while(~scanf("%s", str)){
        flag = false;
        memset(visn, false, sizeof(visn));
        memset(vism, false, sizeof(vism));
        memset(visx, false, sizeof(visx));
        int len = 0;
        do{
            int x = len / 9;
            int y = len % 9;
            int val = (str[0] == '?' ? 0 : str[0] - '0');
            mapn[x][y] = val;
            visn[x][val] = vism[y][val] = visx[x/3][y/3][val] = true;
            if(len == 80)
                break;
            scanf("%s", str);
        }while(++len);
        Dfs(0);
        if(backs)
            printf("\n");
        backs = true;
        for(int i = 0; i < 9; i++){
            for(int k = 0; k < 9; k++){
                if(k)
                    printf(" ");
                printf("%d", mapn[i][k]);
            }
            printf("\n");
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: