POJ 2676

题目是数独,想到了深度优先搜索一个个地验证;

做出来后,妈妈再也不用担心我玩数独被人虐了

 

 


#include <iostream>
using namespace std;
int  num[10][10];
int x,y;
bool judge(int l,int r,int a){              //用于判断同一行,同一列,同一个小九宫格内,是否已经存在相同的
    for(int i=0;i<9;i++){                 // 同一行,同一列的判断
       if(num[i][r]==a)return false;
       if(num[l][i]==a)return false;
    }
    int b=(l/3)*3,c=(r/3)*3;                  //同一个小九宫格的判断,(b,c)就是小九宫格的第一格坐标
    for(int i=b;i<b+3;i++){                
        for(int j=c;j<c+3;j++){
            if(num[i][j]==a)return false;
        }
    }
    return true;
}
bool dfs(int x,int y){
    int i,m,nx=10,ny=10;
    bool ok=false;
    for(m=y;m>=0;m--){
        for(int d=8;d>=0;d--){
            if(0==num[m][d]&&!(x==d&&y==m)){
                nx=d;
                ny=m;
                ok=true;
                break;
            }
        }
        if(ok)break;
    }
    for(i=1;i<10;i++){
        if(!judge(y,x,i))continue;
        num[y][x]=i;
        if(10==nx)return true;
        if(!dfs(nx,ny)){continue;}                  //递归
        return true;
    }

    num[y][x]=0;                          //这一层失败,则重来
    return false;
}
int main()
{   int n;
    cin>>n;
    char ch;
    while(n--){
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                cin>>ch;                        //以字符形式输入,然后转化为数字
                num[i][j]=ch-48;
                if(0==num[i][j]){
                    x=j;
                    y=i;
                }
            }
        }
        dfs(x,y);                            //调用函数
            for(int i=0;i<9;i++){
                for(int j=0;j<9;j++){
                    cout<<num[i][j];
                }
                cout<<endl;
            }
        }
    return 0;
}

posted @ 2014-07-16 16:06  Mr.XuJH  阅读(135)  评论(0编辑  收藏  举报