zoukankan      html  css  js  c++  java
  • POJ 2676

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

    深搜的题目。

    题意呢就是一个数独的游戏,应该都知道规则。

    思路:我的思路很简单,就是用数组来判断某个数字是否可以使用,而每一个数字都由三个条件来限制它,分别是行和列,和其所在的9宫格里面,是不能有重复的。

    如果有重复的,则不能使用,甚至都不能尝试。

    代码写的也比较渣。还有这个题的数据应该不深,从0,0搜和从8,8开始搜,时间差距非常大,我的从0,0开始是1200Ms,从8,8是16Ms.

    这是数据的问题。

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 
     5 int sodu[9][9],flog;
     6 
     7 char a[9][9];
     8 
     9 bool h[9][10],s[9][10],cube[9][10];     //h代表行,s代表列,cube代表数字所在的的是哪一个9宫格。
    10 
    11 int jud(int x)   //用来判断数字是在哪一个9宫格,我的分区是按从0 1 2/3 4 5/6 7 8来分的。
    12 {
    13     if(x>=3&&x<6) return 3;
    14     if(x>=6) return 6;
    15     return 0;
    16 }
    17 
    18 void bfs(int x,int y)
    19 {
    20     for(int q=8;q>=0;q--)  //这个是来判断是否搜索成功。
    21     {
    22         flog=1;
    23         for(int p=8;p>=0;p--)
    24         {
    25             if(sodu[q][p]==0) {flog=2;break;}
    26             if(flog&&p==0&&q==0) flog=0;
    27         }
    28         if(flog==2) break;
    29     }
    30     for(int i=8;i>=0&&flog;i--)
    31         for(int j=8;j>=0;j--)
    32         {
    33             if(sodu[i][j]==0)
    34             {
    35                 for(int k=1;k<10;k++)
    36                 {
    37                     if(h[i][k]&&s[j][k]&&cube[j/3+jud(i)][k])
    38                     {
    39                         sodu[i][j]=k;
    40                         h[i][k]=false;
    41                         s[j][k]=false;
    42                         cube[j/3+jud(i)][k]=false;
    43                         bfs(8,8);
    44                         if(flog==0)return;
    45                         h[i][k]=true;
    46                         s[j][k]=true;
    47                         cube[j/3+jud(i)][k]=true;
    48                     }
    49                 }
    50                 sodu[i][j]=0;   //这里记得要归0,不然回溯的时候,下一次不会再这个数值。
    51                 if(sodu[i][j]==0)return;
    52             }
    53         }
    54 }
    55 
    56 int main()
    57 {
    58     int n;
    59     scanf("%d",&n);
    60     while(n--)
    61     {
    62         for(int i=0;i<9;i++)
    63             scanf("%s",a[i]);
    64         for(int i=0;i<9;i++)
    65             for(int j=0;j<9;j++)
    66                 sodu[i][j]=a[i][j]-'0';
    67         memset(h,true,sizeof(h));
    68         memset(s,true,sizeof(s));
    69         memset(cube,true,sizeof(cube));
    70         for(int i=0;i<9;i++)
    71             for(int j=0;j<9;j++)
    72             {
    73                 if(sodu[i][j]!=0)
    74                 {
    75                     h[i][sodu[i][j]]=false;
    76                     s[j][sodu[i][j]]=false;
    77                     cube[j/3+jud(i)][sodu[i][j]]=false;
    78                 }
    79             }
    80             flog=1;
    81         bfs(0,0);
    82         for(int i=0;i<9;i++)
    83         {
    84            for(int j=0;j<9;j++)
    85             printf("%d",sodu[i][j]);
    86            printf("
    ");
    87         }
    88 
    89     }
    90     return 0;
    91 }
  • 相关阅读:
    vue用户登录状态判断
    Android webView包装WebAPP
    浮动粒子制作404动画页面
    使用 typescript 和 canvas 重构snow效果
    毕达哥拉斯树(pythagorasTree)原理解析及canvas动画实现
    canvas入门之时钟的实现
    canvas动画之动态绘出六边形
    分享一篇vue项目规范
    css3 ajax加载进度线
    react 体验 react与vue的比较
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/5535972.html
Copyright © 2011-2022 走看看