数独!!(外挂)

你遇到不会做的数独怎么办?会编程就是不一样~~~

暂时没找到可提交的地方,往后会加:

输入样例:

0 0 4 0 0 0 0 3 0
0 6 3 0 0 0 0 0 2
8 9 0 1 0 0 0 0 0
0 0 8 0 7 2 0 0 0
0 0 0 8 4 6 0 0 0
0 0 0 9 3 0 5 0 0
0 0 0 0 0 5 0 1 6
1 0 0 0 0 0 8 5 0
0 5 0 0 0 0 3 0 0

输出样例:

2 1 4 6 8 7 9 3 5 
7 6 3 4 5 9 1 8 2 
8 9 5 1 2 3 7 6 4 
9 3 8 5 7 2 6 4 1 
5 7 1 8 4 6 2 9 3 
6 4 2 9 3 1 5 7 8 
3 8 7 2 9 5 4 1 6 
1 2 9 3 6 4 8 5 7 
4 5 6 7 1 8 3 2 9 

上代码:

//数独:9*9

#include<cstdio>
#include<cstring> 
int a[11][11],ans=0;
bool h[20][10],l[20][10],g[20][10];

int ch(int x,int y)//求(x,y)所在的宫 
{
	return 3*((x-1)/3)+(y-1)/3;
}

void dfs(int x,int y)
{

	if(x>9)//做出来一种解 
	{
		ans++;
		printf("%d:\n",ans);//输出当前的解 
		for(int i=1;i<=9;i++)
		{
			for(int j=1;j<=9;j++)
			{
				printf("%d ",a[i][j]);
			}
			printf("\n");	
		}
		return ;
	}
	if(y>9) { dfs(x+1,1);return ; } //填完一行去下一行 
	
	if(a[x][y]>0) { dfs(x,y+1);return ; }//原来格子有数字,不用填
	
	for(int i=1;i<=9;i++)
	{
		int k=ch(x,y);//查找当前坐标所在的宫 
		
		if(h[x][i]&&l[y][i]&&g[k][i])//行、列、宫都没有重复的 
		{
			h[x][i]=l[y][i]=g[k][i]=0;
			a[x][y]=i;
			
			dfs(x,y+1);
			
			a[x][y]=0;//回溯还原 
			h[x][i]=l[y][i]=g[k][i]=1;
		}
	}
	
}

int main()
{
	//freopen("ss.out","w",stdout);
	memset(h,true,sizeof(h));//行 初始化 
	memset(l,true,sizeof(l));//列 初始化 
	memset(g,true,sizeof(g));//宫 初始化 
	int t;
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=9;j++)
		{
			scanf("%d",&t);
			int k=ch(i,j);//找宫 
			h[i][t]=l[j][t]=g[k][t]=0;//封路 
			a[i][j]=t;
		}
	}
	
	dfs(1,1); //从第一行第一列开始搜 
	
	printf("%d",ans);
	
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/liusu201601/article/details/82465525