POJ 2676 Sudoku

来源:互联网 发布:淘宝发布宝贝模板 编辑:程序博客网 时间:2024/05/05 12:24

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

杭电上有类似的题目,可以用舞蹈链求解,不过9*9的数独,舞蹈链完全没有粗暴又简单的DFS来得高效。

本题不需要判断不成立条件,其实判断不成立很简单,两点:第一,输入行、列、九宫格合法,第二,能搜索出来。

呈上我短小精悍又粗暴的AC代码:

#include <cstdio>#include <cstdlib>#include <cstring>bool row[9][10];             //行bool col[9][10];                 //列bool gow[3][3][10];             //九宫格int map[9][9];bool dfs(int z){    if(z>=81){        return true;    }    int x=z/9;    int y=z%9;    if(map[x][y]!=0){        return dfs(z+1);    }    for(int i=1;i<=9;i++){        if(!row[x][i] && !col[y][i] && !gow[x/3][y/3][i]){            row[x][i]=col[y][i]=gow[x/3][y/3][i]=1;            map[x][y]=i;            if(dfs(z+1)) return true;            row[x][i]=col[y][i]=gow[x/3][y/3][i]=0;            map[x][y]=0;        }    }    return false;}int main(){    int t;    scanf("%d",&t);    while(t--){        int i,j;        memset(row,0,sizeof(row));        memset(col,0,sizeof(col));        memset(gow,0,sizeof(gow));        for(i=0;i<9;i++){            char temp[10];            scanf("%s",temp);            for(j=0;j<9;j++){                int c=temp[j]-'0';                map[i][j]=c;                if(c!=0){                    row[i][c]=col[j][c]=gow[i/3][j/3][c]=1;                }            }        }//        printf("%s\n",dfs(0)?"YES":"NO");        dfs(0);        for(i=0;i<9;i++){            for(j=0;j<9;j++)                printf("%d",map[i][j]);            printf("\n");        }    }}


0 0
原创粉丝点击