HDU 1426 Sudoku Killer

来源:互联网 发布:linux cp 排除文件夹 编辑:程序博客网 时间:2024/04/30 14:53

dfs搜索的题目,还是不太会写啊!参考了别人的代码写的。

#include<iostream>#include<cstring>#include<cstdio>using namespace std;int map[9][9];int flag;bool seach(int a,int b,int k){    int i,j;    for(i=0;i<9;i++)               //判断每列是否已经出现k    {        if(map[i][b]==k)            return true;    }    for(i=0;i<9;i++)               //判断每行是否已经出现k    {        if(map[a][i]==k)            return true;    }    for(i=a/3*3;i<a/3*3+3;i++)     //判断每个宫格是否已经出现k    {        for(j=b/3*3;j<b/3*3+3;j++)        {            if(map[i][j]==k)                return true;        }    }    return false;}void dfs(int a,int b){    int k;    if(a==9)    {        flag=1;        return ;    }    if(!map[a][b])    {        for(k=1;k<=9;k++)        {            if(!seach(a,b,k))            {                map[a][b]=k;            //    cout<<k<<endl;                if(b==8) dfs(a+1,0);                else dfs(a,b+1);                if(flag) return ;                map[a][b]=0;            }        }    }    else    {        if(b==8)            dfs(a+1,0);        else            dfs(a,b+1);    }}int main(){//    freopen("in.txt","r",stdin);    int i,j;    char c;    int cnt=0;    while(cin>>c)    {        memset(map,0,sizeof(map));        for(i=0;i<9;i++)        {            for(j=0;j<9;j++)            {                if(i!=0||j!=0)          //开始的时候将|| 写成&&,改了很久才看出,惭愧啊!                    cin>>c;                if(c>'0'&&c<='9')                    map[i][j]=c-'0';            }        }        if(cnt) cout<<endl;        cnt++;        flag=0;        dfs(0,0);        for(i=0;i<9;i++)        {            for(j=0;j<8;j++)            {                cout<<map[i][j]<<' ';            }            cout<<map[i][j]<<endl;        }    }    return 0;}