zoukankan      html  css  js  c++  java
  • poj2676 Sudoku

    这题目是一道求解数独的题目。

    做了简单优化,也从网上找了不少数据测试都OK,然后提交就TLE。最后看了下DISCUSS。发现说倒着搜能过,正着搜超时。

    然后我只是把i=1;i<=81;++i 改成了i=81;i>=1;--i

    。。。。过了。。。

    我的代码进行了优化,剔除了一定不会出现在该位置的值。所以略长,不过很好理解。大家请欣赏!

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <math.h>
      4 #include <stdlib.h>
      5 int gird[10][10];
      6 int res[10][10];
      7 int cnt=0;
      8 int su;
      9 void copyy(){
     10     int i,j;
     11     for(i=1;i<10;++i)    for(j=1;j<10;++j) res[i][j]=gird[i][j];
     12     return ;
     13 }
     14 int ifff(){
     15     int i,j,k;
     16     int I,J,K;
     17     int t;
     18     int sign[10];
     19 
     20     for(i=1;i<=9;++i){
     21         for(j=1;j<=9;++j){
     22             memset(sign,0,sizeof(sign));
     23             for(I=1;I<=9;++I)
     24                 sign[gird[I][j]]=1;
     25             for(k=1;k<=9;++k)
     26                 if(sign[k]==0) return 0;
     27             memset(sign,0,sizeof(sign));
     28             for(J=1;J<=9;++J)
     29                 sign[gird[i][J]]=1;
     30             for(k=1;k<=9;++k)
     31                 if(sign[k]==0) return 0;
     32         }
     33     }
     34     // 1
     35     memset(sign,0,sizeof(sign));
     36     for(i=1;i<=3;++i) for(j=1;j<=3;++j) sign[gird[i][j]]=1;
     37     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
     38     // 2
     39     memset(sign,0,sizeof(sign));
     40     for(i=1;i<=3;++i) for(j=4;j<=6;++j) sign[gird[i][j]]=1;
     41     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
     42     // 3
     43     memset(sign,0,sizeof(sign));
     44     for(i=1;i<=3;++i) for(j=7;j<=9;++j) sign[gird[i][j]]=1;
     45     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
     46     // 4
     47     memset(sign,0,sizeof(sign));
     48     for(i=4;i<=6;++i) for(j=1;j<=3;++j) sign[gird[i][j]]=1;
     49     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
     50     // 5
     51     memset(sign,0,sizeof(sign));
     52     for(i=4;i<=6;++i) for(j=4;j<=6;++j) sign[gird[i][j]]=1;
     53     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
     54     // 6 
     55     memset(sign,0,sizeof(sign));
     56     for(i=4;i<=6;++i) for(j=7;j<=9;++j) sign[gird[i][j]]=1;
     57     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
     58     // 7
     59     memset(sign,0,sizeof(sign));
     60     for(i=7;i<=9;++i) for(j=1;j<=3;++j) sign[gird[i][j]]=1;
     61     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
     62     // 8
     63     memset(sign,0,sizeof(sign));
     64     for(i=7;i<=9;++i) for(j=4;j<=6;++j) sign[gird[i][j]]=1;
     65     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
     66     // 9
     67     memset(sign,0,sizeof(sign));
     68     for(i=7;i<=9;++i) for(j=7;j<=9;++j) sign[gird[i][j]]=1;
     69     for(k=1;k<=9;++k) if(sign[k]==0) return 0;
     70 
     71     return 1;
     72 }
     73 void find(){
     74 //    printf("cnt=%d
    ",cnt++);
     75     if(su==1) return;
     76     if(ifff()==1){
     77         copyy();
     78         su=1;
     79     }
     80     if(su==1) return;
     81     int i,j,k,signi,signj;
     82     int v[10];
     83     int ti1,ti2,tj1,tj2;
     84     for(i=0;i<10;++i) v[i]=0;
     85     for(i=81;i>=1;--i){
     86         if(i%9==0){
     87             if(gird[i/9][9]==0){
     88                 signi=i/9;
     89                 signj=9;
     90                 break;
     91             }
     92         }else{
     93             if(gird[i/9+1][i%9]==0){
     94                 signi=i/9+1;
     95                 signj=i%9;
     96                 break;
     97             }
     98         }
     99     }
    100     for(i=1;i<=9;++i){
    101         if(gird[signi][i]!=0) v[gird[signi][i]]=1;
    102     }
    103     for(i=1;i<=9;++i){
    104         if(gird[i][signj]!=0) v[gird[i][signj]]=1;
    105     }
    106 
    107     if(signi%3==0){
    108         ti1=signi-2;
    109         ti2=signi;
    110     }else{
    111         ti1=(signi/3)*3+1;
    112         ti2=(signi/3+1)*3;
    113     }
    114 
    115     if(signj%3==0){
    116         tj1=signj-2;
    117         tj2=signj;
    118     }else{
    119         tj1=(signj/3)*3+1;
    120         tj2=(signj/3+1)*3;
    121     }
    122     for(i=ti1;i<=ti2;++i){
    123         for(j=tj1;j<=tj2;++j){
    124             v[gird[i][j]]=1;
    125         }
    126     }
    127 
    128 
    129     for(i=1;i<=9;++i){
    130         if(su==1) return;
    131         if(v[i]==1) continue;
    132         gird[signi][signj]=i;
    133         find();
    134         gird[signi][signj]=0;
    135     }
    136     return;
    137 }
    138 
    139 int main(){
    140     char ss[10][10];
    141     int i,j,c;
    142     while(~scanf("%d",&c)){
    143         getchar();
    144         if(c==0) break;
    145         while(c--){
    146             su=0;
    147             for(i=1;i<=9;++i){
    148 //                scanf("%s",ss[i]);
    149                 gets(ss[i]);
    150             }
    151             for(i=1;i<=9;++i){
    152                 for(j=1;j<=9;++j){
    153                     gird[i][j]=ss[i][j-1]-'0';
    154                 }
    155             }
    156             find();
    157             for(i=1;i<=9;++i){
    158                 for(j=1;j<=9;++j)
    159                     printf("%d",res[i][j]);
    160                 printf("
    ");
    161             }
    162         }
    163     }
    164     return 0;
    165 }
  • 相关阅读:
    Python3.5 学习三
    心灵鸡汤20180727
    Python3.5 学习二
    spring心得4--setter注入集合(set、list、map、properties等多种集合,配有案例解析)@基本装(引用)
    drop user和drop user cascade的区别(转)
    数据库的导入 导出
    OracleDBConsole服务无法启动原因
    create XML
    C#里面Console.Write与Console.WriteLine有什么区别????
    将字符串 按照规定编码方式编码
  • 原文地址:https://www.cnblogs.com/symons1992/p/3545278.html
Copyright © 2011-2022 走看看