在9阶数方阵中,包含了81个小格,其中又再分为9个小正方形(称为宫),每宫有九小格,在游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有唯一的解答。
输入:一个9*9的矩阵,0表示该位置是空白。
输出:一个9*9的矩阵,格式与输入类似
#include <stdio.h>
#include <iostream>
using namespace std;
char map[10][10];
struct
{
int h;
int l;
}cor[90];
int cont;
bool fit(char number, int x, int y)
{
int i, j;
for(i = 0; i < 9; i++)
{
if(map[x][i] == number || map[i][y] == number)
{
return false;
}
}
int kh = x - x % 3; //kh,kl为当前x,y所在宫的起始位置的行和列
int kl = y - y % 3;
for(i = kh; i < kl + 3; i++)
{
for(j = kl; j < kl + 3; j++)//遍历该宫内是否有重复数字
{
if(map[i][j] == number)
{
return false;
}
return true;
}
}
}
void search(int index)
{
if(index == cont + 1)
{
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 8; j++)
{
cout << map[i][j];
}
cout << map[i][8] << endl;
}
return;
}
for(int i = 1; i <= 9; i++)
{
char number = i + '0';
if(fit(number, cor[index].h, cor[index].l))
{
map[cor[index].h][cor[index].l] = number;
search(index + 1);
map[cor[index].h][cor[index].l] = '0';
}
}
}
int main(void)
{
int i, j;
cont = -1;
for(i = 0; i < 9; i++)
{
for(j = 0; j < 9; j++)
{
cin >> map[i][j];
if(map[i][j] == '0')
{
++cont;
cor[cont].h = i;
cor[cont].l = j;
}
}
}
printf("\n");
search(0);
}