一秒内破解“最难数独”

 网上看到一则新闻,江苏69岁农民3天破解“世界最难数独”,我也写了个程序破解该数独。

原报道截图如下:

原题如下:

 

运行结果:

 

 

#include<iostream> 
#include<ctime>  
using namespace std;

int p[9][9];                  //存放九宫格数据
int z[][9] = {                //分为九小宫
	{0,0,0,1,1,1,2,2,2},
	{0,0,0,1,1,1,2,2,2},
	{0,0,0,1,1,1,2,2,2},
	{3,3,3,4,4,4,5,5,5},
	{3,3,3,4,4,4,5,5,5},
	{3,3,3,4,4,4,5,5,5},
	{6,6,6,7,7,7,8,8,8},
	{6,6,6,7,7,7,8,8,8},
	{6,6,6,7,7,7,8,8,8},
};
int r[9][10];               //r[i][j]为1时,第i行数字j(1~9)已放置
int c[9][10];               //c[m][n]为1时,第m列数字n(1~9)已放置
int d[9][10];               //d[x][y]为1时,第x宫数字y(1~9)已放置
int count;                  //解的个数

void input();
void output();
void init();
void search(int);
int main()
{
	clock_t clockBegin, clockEnd;  //用clock()来计时 毫秒 

	cout<<"输入:"<<endl;
	input();	
	cout<<"输出:"<<endl;
	clockBegin = clock();          //计时开始 
	init();
	search(0);	
	clockEnd = clock();            //计时结束 
	cout<<"计算用时"<< clockEnd - clockBegin<<"ms"<<endl;  
	return 0;
}

void output(){
	int i,j;
	for(i = 0; i < 9; i++){
		for(j = 0; j < 9; j++){
			cout<<p[i][j]<<' ';
		}
		cout<<endl;
	}
	count++;
}
void init(){		
	int i,j,x;
	for(i = 0; i < 9; i++){
		for(j = 0; j < 9; j++){
			x = p[i][j];
			if(x == 0)
				continue;
			else{
				r[i][x] = 1;
				c[j][x] = 1;
				d[z[i][j]][x] = 1;
			}
		}
	}
}

void search(int cur)
{
	if(count == 1) 
		return;
	else if(cur == 81)              //递归边界
		output();
	else{
		int i,j,k,l;
		i = cur / 9;                //行号
		j = cur % 9;                //列号
		if(p[i][j] != 0)
			search(cur + 1);
		else{
			l = z[i][j];
			for(k = 1; k <= 9; k++){
				if(r[i][k]||c[j][k]||d[l][k])   //检查行、列和宫内是否冲突
					continue;
				p[i][j] = k;
				r[i][k] = c[j][k] = d[l][k] = 1; //修改全局变量
				search(cur + 1);					
				p[i][j] = r[i][k] = c[j][k] = d[l][k] =0;
			}
		}
	}
}

void input(){
	int i,j;
	for(i = 0; i < 9; i++)
		for(j = 0; j < 9;j++)
			cin>>p[i][j];
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值