看了别人的,思路很明确,但敲起来很困难,输入输出都要注意,越是长的题就越不容易找错误,还需要好好理解啊。。。
PS:今天上午看了库里的封神战,有点感触,我们的努力不会白费,未来的奇迹就是由这些努力创造的!
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <stdlib.h>
using namespace std;
const int N = 30;
const int INF = 1000000;
int Map[N][N];
int k, f;
struct node
{
int x, y;
}road[90];
bool check(int r, int s)
{
int i, j;
int x = road[r].x;
int y = road[r].y;
for(i = 0; i < 9; i ++)
if(Map[x][i] == s || Map[i][y] == s) return false;
x = x / 3 * 3;
y = y / 3 * 3;
for(i = 0; i < 3; i ++)
for(j = 0; j < 3; j ++)
if(Map[x + i][y + j] == s) return false;
return true;
}
void dfs(int r)
{
int i, j;
if(r == k)
{
f = 1;
for(i = 0; i < 9; i ++)
{
printf("%d", Map[i][0]);
for(j = 1; j < 9; j ++)
printf(" %d", Map[i][j]);
printf("\n");
}
}
if(f) return;
for(i = 1; i <= 9; i ++)
{
if(check(r, i))
{
Map[road[r].x][road[r].y] = i;
dfs(r + 1);
Map[road[r].x][road[r].y] = 0;
}
}
}
int main()
{
// freopen("in.txt", "r", stdin);
char a[3];
int i, j, flag = 0;
while(~scanf("%s", a))
{
if(flag) printf("\n");
flag = 1;
k = f = 0;
for(i = 0; i < 9; i ++)
for(j = 0; j < 9; j ++)
{
if(i == 0 && j == 0);
else
scanf("%s", a);
if(a[0] == '?')
{
Map[i][j] = 0;
road[k].x = i;
road[k ++].y = j;
}
else Map[i][j] = a[0] - '0';
}
dfs(0);
}
return 0;
}