数独游戏

在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);

}

 

                  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值