问题 F: 数独游戏

题目描述
芬兰数学家因卡拉,花费3个月时间设计出了世界上迄今难度最大的数独游戏,而且它只有一个答案。因卡拉说只有思考能力最快、头脑最聪明的人才能破解这个游戏。这是英国《每日邮报》2012年6月30日的一篇报道。
作为Acmer的你,能写一个程序解决所有的数独问题吗?
世界上迄今难度最大的数独游戏:

输入
本题包含多组测试。每组测试会给你一个 9*9 的矩阵,同一行相邻的两个元素用一个空格分开。其中1-9代表该位置的已经填好的数,问号(?)表示需要你填的数。
输出
对于每组测试,请输出它的解,同一行相邻的两个数用一个空格分开。两组解之间要一个空行。 如果有多种答案,输出任意一种即可!
样例输入 Copy
? 2 6 7 ? ? 5 1 8
7 3 1 ? 5 8 6 2 4
5 4 ? 2 6 1 3 9 7
6 ? 4 3 7 ? ? 8 1
2 8 7 1 9 6 4 3 5
1 9 ? ? 8 4 7 6 2
3 7 ? 8 ? 9 1 4 6
8 ? 9 4 1 5 2 7 3
? 1 2 6 3 7 8 5 9
? 2 6 7 ? ? 5 1 8
7 3 1 ? 5 8 6 2 4
5 4 ? 2 6 1 3 9 7
6 ? 4 3 7 ? ? 8 1
2 8 7 1 9 6 4 3 5
1 9 ? ? 8 4 7 6 2
3 7 ? 8 ? 9 1 4 6
8 ? 9 4 1 5 2 7 3
? 1 2 6 3 7 8 5 9
样例输出 Copy
9 2 6 7 4 3 5 1 8
7 3 1 9 5 8 6 2 4
5 4 8 2 6 1 3 9 7
6 5 4 3 7 2 9 8 1
2 8 7 1 9 6 4 3 5
1 9 3 5 8 4 7 6 2
3 7 5 8 2 9 1 4 6
8 6 9 4 1 5 2 7 3
4 1 2 6 3 7 8 5 9

9 2 6 7 4 3 5 1 8
7 3 1 9 5 8 6 2 4
5 4 8 2 6 1 3 9 7
6 5 4 3 7 2 9 8 1
2 8 7 1 9 6 4 3 5
1 9 3 5 8 4 7 6 2
3 7 5 8 2 9 1 4 6
8 6 9 4 1 5 2 7 3
4 1 2 6 3 7 8 5 9

#include
using namespace std;
int mp[10][10];
char b;
int sum,flag1;
int vis[10][10]; 
struct s{//结构体用来存储?的位置
	int x,y;
}a[100];
bool check(int x,int step)
{
	for(int i=0;i<9;i++)
	{
		if(mp[a[step].x][i]==x||mp[i][a[step].y]==x)//判断这列这行有无出现过
		return false;
	}
	//把这个数转换成三的倍数
	int xx=a[step].x/3*3;
	int yy=a[step].y/3*3;
	for(int i=xx;i<xx+3;i++)
	{
		for(int j=yy;j<yy+3;j++)
		{
			if(mp[i][j]==x)
			return false;
		}
	}
	return true;
}
void dfs(int step)
{
	if(step==sum)
	{
		flag1=1;//超关键!一开始wa就是因为如果答案会出多组,
				//只要出一组,但我会死循环
		for(int i=0;i<9;i++)
		{
			for(int j=0;j<9;j++)
			{
				if(j==0)
				{
					printf("%d",mp[i][j]);
				}
				else
				printf(" %d",mp[i][j]);
			}
			printf("\n");
		}
	}
	for(int i=1;i<=9;i++)
	{
		if(check(i,step)&&flag1==0)
		{
			mp[a[step].x][a[step].y]=i;
			dfs(step+1);
			mp[a[step].x][a[step].y]=0;//回溯
		}
	}
	return ;
}
int main()
{
	int flag=0;
	while(cin>>b)
	{
		flag1=0;
		sum=0;
		if(b=='?')
		{
			a[sum].x=0;
			a[sum].y=0;
			sum++;
			mp[0][0]=0;
		}
		else
		{
			mp[0][0]=b-'0';
		}
		for(int i=0;i<9;i++)
		{
			for(int j=0;j<9;j++)
			{
				if(i==0&&j==0)
				{
					continue;
				}
				cin>>b;
				if(b=='?')
				{
					a[sum].x=i;
					a[sum].y=j;
					sum++;
					mp[i][j]=0;
				}
				else
				{
					mp[i][j]=b-'0';
				}
			}
		}	
		if(flag==0)
		{
			flag=1;
		}
		else
		printf("\n");
		dfs(0);
	} 
	return 0;
}
//?????????
//?????????
//?????????
//?????????
//?????????
//?????????
//?????????
//?????????
//?????????

你可能感兴趣的:(问题 F: 数独游戏)