题目地址:
http://poj.org/problem?id=2676
#include<stdio.h>
#include<string.h>
char map[10][10];
int sum;
int makt[9];
bool makt2[10][10];
void init()
{
int i ,j;
sum = 0;
for( i = 0; i < 9; i++)
{
getchar();
for( j = 0; j < 9; j++)
{
scanf("%c",&map[i][j]);
if(map[i][j] != '0')
{
sum++;
}
}
}
}
bool CanBe(int col,int row,char e)//判断e在col横,row列是否可以放
{
int j,m,n;
for(j = 0; j < 9; j++)
{
if(map[col][j] == e)
{
return false;
}
}
for(m = 0; m < 9; m++)
{
if(map[m][row] == e )
{
return false;
}
}
for(m = 0; m < 3 ; m++)
{
for(n = 0; n < 3; n ++)
{
if(map[col/3*3+m][row/3*3+n] == e )
{
return false;
}
}
}
return true;
}
bool dfs(int col)
{
int i,j,k;
if(sum == 81)
return true;
for( i = col ;i < 9; i++)
{
for(j = 0; j < 9; j++)
{
if(map[i][j] == '0')
{
for(k = 9; k > 0; k--)//倒搜,从9搜到1(从9搜到1的时间为16MS,从1到9搜索的时间为1547MS)
{
if(CanBe(i,j,k+'0'))
{
sum ++;
map[i][j] = k + '0';
if(dfs(i))
{
return true;
}
map[i][j] = '0';
sum --;
}
}
return false;
}
}
}
return false;
}
int main()
{
int T,i;
scanf("%d",&T);
while( T-- )
{
init();
dfs(0);
for( i = 0; i < 9; i++)
{
printf("%s\n",map[i]);
}
}
return 0;
}
#include<stdio.h>
#include<string.h>
char map[10][10];
int sum;
int makt[9];
bool makt2[10][10];
void init()
{
int i ,j;
sum = 0;
for( i = 0; i < 9; i++)
{
getchar();
for( j = 0; j < 9; j++)
{
scanf("%c",&map[i][j]);
if(map[i][j] != '0')
{
sum++;
}
}
}
}
bool CanBe(int col,int row,char e)//判断e在col横,row列是否可以放
{
int j,m,n;
for(j = 0; j < 9; j++)
{
if(map[col][j] == e)
{
return false;
}
}
for(m = 0; m < 9; m++)
{
if(map[m][row] == e )
{
return false;
}
}
for(m = 0; m < 3 ; m++)
{
for(n = 0; n < 3; n ++)
{
if(map[col/3*3+m][row/3*3+n] == e )
{
return false;
}
}
}
return true;
}
bool dfs(int col)
{
int i,j,k;
if(sum == 81)
return true;
for( i = col ;i < 9; i++)
{
for(j = 0; j < 9; j++)
{
if(map[i][j] == '0')
{
for(k = 9; k > 0; k--)//倒搜,从9搜到1(从9搜到1的时间为16MS,从1到9搜索的时间为1547MS)
{
if(CanBe(i,j,k+'0'))
{
sum ++;
map[i][j] = k + '0';
if(dfs(i))
{
return true;
}
map[i][j] = '0';
sum --;
}
}
return false;
}
}
}
return false;
}
int main()
{
int T,i;
scanf("%d",&T);
while( T-- )
{
init();
dfs(0);
for( i = 0; i < 9; i++)
{
printf("%s\n",map[i]);
}
}
return 0;
}