zoukankan      html  css  js  c++  java
  • 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);
          
          
        }
    }
    
  • 相关阅读:
    net应用程序池自动关闭的解决方法
    asp.net 多个txt压缩导出下载
    asp.net 对象转XML,XML转对象
    asp.net Cache缓存的用法
    oracle 增加大字段项
    asp.net简繁体转换
    asp.net 根据连接地址保存文件,图片
    SpringSide从系统全局里面取值
    SpringSide dml操作
    一张表里面形成的树,固定初始化数据
  • 原文地址:https://www.cnblogs.com/sook/p/1996412.html
Copyright © 2011-2022 走看看