数独

参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int a[9][9]={
	{8,0,0,0,0,0,0,0,0},
	{0,0,3,6,0,0,0,0,0},
	{0,7,0,0,9,0,2,0,0},
	{0,5,0,0,0,7,0,0,0},
	{0,0,0,0,4,5,7,0,0},
	{0,0,0,1,0,0,0,3,0},
	{0,0,1,0,0,0,0,6,8},
	{0,0,8,5,0,0,0,1,0},
	{0,9,0,0,0,0,4,0,0}
	};
long count=0;
bool test(int x,int y)
{
	int i,j;
	int left,up;
	for(i=0;i<9;i++)
	{
		if(i!=y&&a[x][y]==a[x][i])
			return false;
		if(i!=x&&a[x][y]==a[i][y])
			return false;
	}
	left=y/3*3;
	up=x/3*3;
	for(i=up;i<up+3;i++)
		for(j = left;j < left + 3;j++)
			if(x!=i && y!=j && a[x][y]==a[i][j])
				return false;
	return true;
}
void backtrack(int x,int y)
{
	int i,j;
	if(x==9)
	{
		for(i=0;i<9;i++)
		{
			for(j=0;j<9;j++)
				printf("%d\t",a[i][j]);
			putchar('\n');
			putchar('\n');
		}
		printf("OK!\n");
		exit(1);
	}
	else
	{
		if(y==9)
		{
			x++;
			y=0;
			backtrack(x,y);
		}
		else
		{
			if(a[x][y]==0)
			{
				for(i=1;i<10;i++)
				{
					a[x][y]=i;
					if(test(x,y))
					{
						backtrack(x,y+1);
					}
				}
				a[x][y]=0;
			}
			else
				backtrack(x,y+1);
		}
	}
}
int main()
{
/*	int i,j;
	printf("输入:\n");
	for(i=0;i<9;i++)
	{
		for(j=0;j<9;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}*/
	printf("结果:\n");
	backtrack(0,0);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值