hdu: 1426 ( Sudoku Killer )

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

Problem : 1426 ( Sudoku Killer )     Judge Status : Accepted
RunId : 3712414    Language : C++    Author : zjut11018
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
借助此题学习DFS
思路:把需要填数的位置保存到q中,再递归求解
#include<iostream>
using namespace std;
int map[9][9];
int num,ok;
struct node
{
    int x,y;
}q[81];
bool check(int k,int cur)//判断所填的数是否合法 k为准备要填的数,cur为要填的位置在q中的编号
{
     for(int i=0;i<9;i++)
     {
         if(map[q[cur].x][i]==k||map[i][q[cur].y]==k)return 0;//判断行和列是否用过k
     }
     int x=q[cur].x/3*3;
     int y=q[cur].y/3*3;
     for(int i=0;i<3;i++)//判断9个格子的小块是否用过k
         for(int j=0;j<3;j++)
         {
             if(map[x+i][y+j]==k)return 0;
         }
         
     return 1;
}
void DFS(int cur)
{
    if(cur==num)//数独表形成
    {
         for(int i=0;i<9;i++)//注意应该在这个位置就马上打印 否则回溯掉 表就没了
         {
           for(int j=0;j<8;j++)
           {
               printf("%d ",map[i][j]);
           }
           printf("%d\n",map[i][8]);
         }
        ok=1;
        return;
    }
    else 
    {
        for(int i=1;i<=9;i++)
        {
            if(check(i,cur)&&!ok)//填的数合法且最终答案还未形成
            {
                map[q[cur].x][q[cur].y]=i;//填表
                DFS(cur+1);//递归
                map[q[cur].x][q[cur].y]=0;//回溯
            }
        }
    }
    return;
}
int main()
{
    char s;
    int cas=0;
    while(cin>>s)
    {
        num=0;
        if(s=='?')map[0][0]=0;
        else map[0][0]=s-'0';
        for(int i=0;i<9;i++)
           for(int j=0;j<9;j++)
           {
               if(!(i==0&&j==0))cin>>s;
               if(s=='?')
               {
                   map[i][j]=0;
                   q[num].x=i;q[num].y=j;//把问号格子的坐标存在q里
                   num++;
               }
               else map[i][j]=s-'0';
           }
           ok=0; 
           if(cas++)printf("\n");
       DFS(0);
      
      
    }
}
posted on 2011-03-26 17:17  4.5.6  阅读(728)  评论(0编辑  收藏  举报