数独问题

数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。

#include<stdio.h>
#define n 9
int a[n][n]={
    0, 0, 5, 3, 0, 0, 0, 0, 0,
    8, 0, 0, 0, 0, 0, 0, 2, 0,
    0, 7, 0, 0, 1, 0, 5, 0, 0,
    4, 0, 0, 0, 0, 5, 3, 0, 0,
    0, 1, 0, 0, 7, 0, 0, 0, 6,
    0, 0, 3, 2, 0, 0, 0, 8, 0,
    0, 6, 0, 5, 0, 0, 0, 0, 9,
    0, 0, 4, 0, 0, 0, 0, 3, 0,
    0, 0, 0, 0, 0, 9, 7, 0, 0
};

//判断大九宫格和小九宫格中有没有不符合条件的
bool ok(int x,int y)
{
//根据行和列以此判断大九宫格中有没有不符合条件的
	int i,j;
	for(i=0; i<n; i++)
		if(i!=x && a[i][y]!=0 && a[i][y]==a[x][y])
			return false;

	for(j=0; j<n; j++)
		if(j!=y && a[x][j]!=0 && a[x][j]==a[x][y])
			return false;

//根据大九宫格的坐标求出每个小九宫格中数的坐标
	int x1=x/3*3;
	int y1=y/3*3;

//判断九个小九宫格中有没有不符合条件的
	for(i=x1; i<x1+3; i++)
		for(j=y1; j<y1+3; j++)
			if(i!=x && j!=y && a[i][j]!=0 && a[i][j]==a[x][y])
				return false;
	return true;
}

//进行回溯
void traceback(int t)
{
	if(t==n*n)    //当t走到最后一层时,输出数组
	{
		for(int i=0; i<n; i++)
		{
			for(int j=0; j<n; j++)
				printf("%d ",a[i][j]);
			putchar('\n');
		}
	}
	else
	{
		//求出t时的坐标
		int x=t/9;
		int y=t%9;

		if(a[x][y]==0)   //当a[x][y]没有数时,给a[x][y]进行赋值
		{
			for(int i=1; i<=n; i++)
			{
				a[x][y]=i;
				if(ok(x,y))  //如果赋的值符合条件,判断下一层
					traceback(t+1);
				a[x][y]=0;
			}
		}
		else    //当a[x][y]有数时,直接判断下一层
			traceback(t+1);
	}

}

int main()
{
	traceback(0);
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值