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秒，呵呵呵，时间挺长的，觉得直接

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

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

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;
}