Sudoku Killer
据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品———HDU免费七日游外加lcy亲笔签名以及同hdu acm team合影留念的机会。
所以全球人民前仆后继,为了奖品日夜训练茶饭不思。当然也包括初学者linle,不过他太笨了又没有多少耐性,只能做做最最基本的数独题,不过他还是想得到那些奖品,你能帮帮他吗?你只要把答案告诉他就可以,不用教他是怎么做的。
数独游戏的规则是这样的:在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题,大家可以仔细观察一下,在这里面每行、每列,以及每个3x3的方格都包含1-9这九个数字。
对于每组测试数据保证它有且只有一个解。
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
char map[10][10];
int mm[10][10];
typedef struct S {
int x, y;
} GOOD;
GOOD good[100];
char s[25];
int row[10][10], col[10][10], blo[10][10];
int cnt;
int dfs(int now) {
if (now == cnt)
return 1;
int block, xx, yy, t;
xx = good[now].x;
yy = good[now].y;
block = (xx / 3)*3 + yy / 3;
for (t = 1; t <= 9; ++t) {
if (row[xx][t] == 0 && col[yy][t] == 0 && blo[block][t] == 0) {
mm[xx][yy] = t;
row[xx][t] = 1;
col[yy][t] = 1;
blo[block][t] = 1;
if (dfs(now + 1))
return 1;
row[xx][t] = 0;
col[yy][t] = 0;
blo[block][t] = 0;
}
}
return 0;
}
int main() {
int i, j;
int first = 1;
while (scanf("%s", s) != EOF) {
if (first)
first = 0;
else
printf("\n");
memset(row, 0, sizeof (row));
memset(col, 0, sizeof (col));
memset(blo, 0, sizeof (blo));
cnt = 0;
i = 0;
j = 0;
if (s[0] == '?') {
good[cnt].x = i;
good[cnt].y = j;
++cnt;
} else {
mm[i][j] = s[0] - '0';
row[i][mm[i][j]] = 1;
col[j][mm[i][j]] = 1;
blo[(i / 3)*3 + j / 3][mm[i][j]] = 1;
}
for (i = 0; i < 9; ++i) {
for (j = 0; j < 9; ++j) {
if (i == 0 && j == 0)
continue;
scanf("%s", s);
if (s[0] == '?') {
good[cnt].x = i;
good[cnt].y = j;
++cnt;
} else {
mm[i][j] = s[0] - '0';
row[i][mm[i][j]] = 1;
col[j][mm[i][j]] = 1;
blo[(i / 3)*3 + j / 3][mm[i][j]] = 1;
}
}
}
dfs(0);
for (i = 0; i < 9; ++i) {
for (j = 0; j < 9; ++j) {
printf("%d", mm[i][j]);
if (j == 8)
printf("\n");
else
printf(" ");
}
}
}
return 0;
}

浙公网安备 33010602011771号