noj1202数独游戏

描述
数独游戏规则
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,
使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。
 
输入
一个9*9的矩阵,0表示该位置是空白。
 
输出
一个9*9的矩阵,格式与输入类似。
 
输入样例
900050060
020070100
300102040
703800529
000345000
516009403
050208006
007090010
030010004
 
输出样例
971453268
428976135
365182947
743861529
892345671
516729483
154238796
687594312
239617854
 
#include <iostream>
#include <stdio.h>

using namespace std;

int grid[9][9],total;
bool flag=false;

struct point
{
	int x,y;
}needsolve[80];

bool check(int x,int y,int t)//尝试把t放进grid[x][y]里
{
	int i,j,bigx,bigy;
	for (i=0;i<=8;i++)
	{
		if (grid[x][i]==t||grid[i][y]==t)
		{
			return false;
		}
	}
	bigx=x/3;
	bigy=y/3;
	for (i=bigx*3;i<=bigx*3+2;i++)
	{
		for (j=bigy*3;j<=bigy*3+2;j++)
		{
			if (grid[i][j]==t)
			{
				return false;
			}
		}
	}
	return true;
}

void write()
{
	int i,j;
	for (i=0;i<=8;i++)
	{
		for (j=0;j<=8;j++)
		{
			printf("%d",grid[i][j]);
		}
		printf("\n");
	}
	return;
}

void dfs(int now)//对needsolve[now]进行讨论
{
	int i;
	if (now>=total)
	{
		write();
		flag=true;
		return;
	}
	else if (flag==false)
	{
		for (i=1;i<=9;i++)
		{
			if (check(needsolve[now].x,needsolve[now].y,i)==true)
			{
				grid[needsolve[now].x][needsolve[now].y]=i;
				dfs(now+1);
				grid[needsolve[now].x][needsolve[now].y]=0;
			}
		}
	}
	return;
}

int main()
{
	int i,j,k=0;
	for (i=0;i<=8;i++)
	{
		for (j=0;j<=8;j++)
		{
			scanf("%1d",&grid[i][j]);
			if (grid[i][j]==0)
			{
				needsolve[k].x=i;
				needsolve[k].y=j;
				k++;
			}
		}
	}
	total=k;
	dfs(0);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值