回溯法解数独题

          近段时间用到回溯算法的地方比较多,对算法的理解也有深入。今天偶然发现一张照片,是高中时未做完的一道数独题。当时用的是“候选余数法”,之后由于太麻烦,就没有做完。不过当时截图保存了,今天突然看到。那时候刚学完C语言,对汉诺塔递归都不是太理解,所以就一直拖到现在。




C++做的,代码如下


#include<iostream>
using namespace std;
  
int sudoku[9][9]={0};
  
//判断填在空白位置的数字在行、列上是否符合要求
bool Judge1(int x, int y, int n)
{
	int i;
	
	for(i=0;i<9;i++)
	{
		//判断 列
		if((sudoku[i][y]==n)&& (i!=x))
			return false;
		//判断 行
		if((sudoku[x][i]==n)&& (i!=y))
			return false;
	}

	return true;
}
  
//判断填在空白位置的数字在九宫格之内是否符合要求
bool Judge2(int x, int y, int n)
{
	int xx,yy,i,j;
	xx=x/3;
	yy=y/3;
	for(i=xx*3;i<xx*3+3;i++)
		for(j=yy*3;j<yy*3+3;j++)
			if(sudoku[i][j]==n)
				if(i==x&& j==y)
					continue;
				else
					return false;
	return true;
}
  
//填充空白数组
bool Fill(int m)
{
	int n,x,y;
	x=m/9;
	y=m%9;
	if (m>=81)
		return true;
	if (sudoku[x][y]==0)
	{
		for(n=1;n<=9;n++)
		{
			sudoku[x][y]=n;
			if(Judge1(x,y,n)&&Judge2(x,y,n))
				if(Fill(m+1))
					return true;
			sudoku[x][y]=0;
								
		}
	}
	else
		return Fill(m+1);

	return false;
}
  
int main()
{
	//输入初始数独
	int i,j,k;
	cout << "输入初始数独数据,空白用0代替" <<endl;
	for(i=0;i<9;i++)
				for(j=0;j<9;j++)
							cin>>sudoku[i][j];
	
	/*for(i=0;i<9;i++)
	{
				for(j=0;j<9;j++)
							cout<< sudoku[i][j] << " ";
				cout << endl;
	}*/

	
	if(Fill(0))//填充数独的空白位置完毕
	{
		for(i=0;i<9;i++)
		{
			for(j=0;j<9;j++)
			{
				cout<< sudoku[i][j] << " ";
				if(!((j+1)%3))
					cout<< "| ";
			}
			cout<< endl;
			if(!((i+1)%3))
			{
				for(k=0;k<12;k++)
					cout<<"__";
				cout<< endl;
			}
		}

	}
	else
		cout << "该数独无解,请注意游戏规则或检查原始数独是否有误" << endl;

	return 0;
}



运行之后的截图





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值