C语言版:
                                                                                              Sudoku
Time Limit: 2000MS   Memory Limit: 65536K
 

Description

Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3×3 as shown on the Figure. In some of the cells are written decimal digits from 1 to 9. The other cells are empty. The goal is to fill the empty cells with decimal digits from 1 to 9, one digit per cell, in such way that in each row, in each column and in each marked 3×3 subsquare, all the digits from 1 to 9 to appear. Write a program to solve a given Sudoku-task.

Input

The input data will start with the number of the test cases. For each test case, 9 lines follow, corresponding to the rows of the table. On each line a string of exactly 9 decimal digits is given, corresponding to the cells in this line. If a cell is empty it is represented by 0.

Output

For each test case your program should print the solution in the same format as the input data. The empty cells have to be filled according to the rules. If solutions is not unique, then the program may print any one of them.

Sample Input

1

103000509

002109400

000704000

300502006

060000050

700803004

000401000

009205800

804000107

Sample Output

143628579

572139468

986754231

391542786

468917352

725863914

237481695

619275843

854396127

 

          这是一个众人都知道的一个游戏,题意就不用说啦,一看时间,2秒,呵呵呵,时间挺长的,觉得直接

用深搜的暴力破解不知有没有问题结果试了一下,果然没有问题,时间大概1.7秒左右。

         具体思路:判断某一个不为零的格子,看看它的本行本列以及相联系的一个宫已有那些数字,然后再把

有数字依次往里面填,填好这个方格后继续填写下一个方格,如果走到后面走不通了,就应该返回来,把

刚刚它的那个数字还原为零,这样好下一次再继续填写另外的数,如果所有的方格都填完了,整个回溯也就结

束了。

         至于大牛们为什么能写出零毫秒的代码,本人菜鸟一个,很难知晓呀。

 

具体代码如下:

      Result                            Memory                     Time

      Accepted                       160K                           1704MS

 

#include<stdio.h>

char Array[11][11];
int p,q,pos1,pos2,t;

int judge(int i,int j,int k)
{
        pos1=p=((i-1)/3)*3+1;
        pos2=q=((j-1)/3)*3+1;
        for(t=1;t<=9;t++)   /*判断本列有没有那个数和将要填的这个数相等,不相等返回0*/
            if(Array[t][j]==k)
                  return 0;
       for(t=1;t<=9;t++)   /*判断本行有没有那个数和将要填的这个数相等,不相等返回0*/
            if(Array[i][t]==k)
                 return 0;
       for(p=pos1;p<pos1+3;p++)  /*判断相联系的一个宫有没有那个数和将要填的这个数相等,不相等返回0*/
             for(q=pos2;q<pos2+3;q++)
                   if(Array[p][q]==k)
                         return 0;
       return 1;    /*都不相等没有时返回1*/
}

int DFS(int i,int j)   /*DFS函数,进行搜索*/
{
       int k;
       if(j==10)  /*如果j==10了,就应该填写下一行,也就是i要加一,下面同理*/
       {
            j=1;
            i++;
            if(i==10)  /*如果i==10的话,证明已经把最后一个空都已填上了哦*/
                 return 1;
       }
       while(Array[i][j]!='0')  /*判断现在正准备填数的这个空是否已经已经有数了,为零表示没有*/
       {
             j++;
             if(j==10)
             {
                   j=1;
                   i++;
             }
             if(i==10)  /*与上面的i==10同理哦*/
             return 1;
       }
       for(k=49;k<=57;k++)
       {
             if(judge(i,j,k))
            {
                   Array[i][j]=k;
                   if(DFS(i,j+1))  /*如果返回一的话,就应该继续调用,或者当i==10返回来时,就应该结束程序了哦*/
                         return 1;
                   Array[i][j]='0';  /*否则的话,就应该把原来填的那个值赋值为 0 哦,方便下一次好继续填写哦*/
            }
       }
       return 0;
}

int main()
{
        int i,m;
        scanf("%d",&m);
        getchar();   /*输完一个整数后,就应该知道后面有一个空字符哦*/
        while(m–)
        {
                 for(i=1;i<=9;i++)  /*让数组的第一个元素放置不用,可以这样写哦*/
                       gets(&Array[i][1]);
                DFS(1,1);       /*调用函数,使一开始就让它从第一个位置开始填写*/
                for(i=1;i<=9;i++)
                       puts(&Array[i][1]);
       }
      return 0;
}

 

发表评论

电子邮件地址不会被公开。

Post Navigation