题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=722
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int Graph[10][10];
bool InputInRow[10][10];//InputInRow[k][i]表示第k行是否放置了数字i
bool InputInCol[10][10];//InputInCol[k][i]表示第k列是否放置了数字i
bool Grid[10][10];//graid[k][i]表示第k个3*3方格是否放置了数字i
bool DFS(int x, int y)
{
if(x == 9)//表明填写成功
return true;
if(Graph[x][y])//如果这个位置已经填上数字,那么在搜索下一位
{
if(y == 8)//该位置的纵坐标是否已经到达边界,到达边界就从下一行的0列开始
{
if(DFS(x+1, 0))
return true;
return false;
}
else//如果不是那么就搜索下一列
{
if(DFS(x, y+1))
return true;
return false;
}
}
for(int i = 0; i < 9; ++i)
{
int k = 3 * (x/3) + (y/3);//第k个3*3小方格,这个应该好理解
if(!InputInRow[x][i+1] && !InputInCol[y][i+1] && !Grid[k][i+1])
{
Graph[x][y] = i+1;
InputInRow[x][i+1] = true, InputInCol[y][i+1] = true;
Grid[k][i+1] = true;
if(y == 8)
{
if(DFS(x+1, 0))
return true;
}
else
if(DFS(x, y+1))
return true;
InputInRow[x][i+1] = false;
InputInCol[y][i+1] = false;
Grid[k][i+1] = false;
Graph[x][y] = 0;
}
}
return false;
}
int main()
{
int T, i, j;
scanf("%d", &T);
while(T--)
{
memset(Graph, 0, sizeof(Graph));
memset(InputInRow, false, sizeof(InputInRow));
memset(InputInCol, false, sizeof(InputInCol));
memset(Grid, false, sizeof(Grid));
for(i = 0; i < 9; ++i)
{
for(j = 0; j < 9; ++j)
{
scanf("%d", &Graph[i][j]);
if(Graph[i][j])
{
int k = 3 * (i/3) + (j/3);
InputInRow[i][Graph[i][j]] = true;
InputInCol[j][Graph[i][j]] = true;
Grid[k][Graph[i][j]] = true;
}
}
}
DFS(0, 0);
for(i = 0; i < 9; ++i)
{
for(j = 0; j < 8; ++j)
printf("%d ", Graph[i][j]);
printf("%d\n", Graph[i][j]);
}
}
return 0;
}