你一定听说过“数独”游戏。
如下图所示,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。
数独的答案都是唯一的,所以,多个解也称为无解。
本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。
本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。
格式要求,输入9行,每行9个数字,0代表未知,其它数字为已知。
输出9行,每行9个数字表示数独的解。
输入(即图中题目):
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700
程序应该输出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764
再例如,输入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400
程序应该输出:
812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452
#include <stdio.h>
int a[9][9];
int place(int x, int y)
{
// 用来表示每个小正方行组的坐标范围
int up, down, left, right;
up = x / 3 *3;
down = up + 3;
left = y / 3 * 3;
right = left + 3;
// 分三种情况判断: 行, 列, 小正方形组
// 1.判断行
for (int i = 0; i < 9; i++) {
if (a[x][y] == a[x][i] && y != i) {
return 0;
}
}
// 判断列
for (int i = 0; i < 9; i++) {
if (a[x][y] == a[i][y] && x != i) {
return 0;
}
}
// 判断a[x][y]所在小正方形组
for (int i = up; i < down; i++) {
for (int j = left; j < right; j++) {
if (a[x][y] == a[i][j] && x != i && y != j ) {
return 0;
}
}
}
return 1;
}
void backtrack(int t)
{
if (t == 81)
{
printf("=============================\n");
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
printf("%d",a[i][j]);
}
printf("\n");
}
}
else
{
int x = t / 9; // 行
int y = t % 9; // 列
if (a[x][y] != 0)
{
backtrack(t+1);
}
else
{
for (int i = 1; i <= 9; i++) {
a[x][y] = i;
if (place(x, y)) {
backtrack(t+1);
}
a[x][y] = 0;
}
}
}
}
int main(int argc, const char * argv[])
{
// 初始化
char str[9][9];
printf("请输入数据(0代表空白):\n");
for (int i = 0; i < 9; i++) {
gets(str[i]);
}
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
a[i][j] = str[i][j] - '0';
}
}
backtrack(0);
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。