YbtOJ 深度搜索课堂过关 例2 数独游戏【深度优先搜索】

在这里插入图片描述


思路

这道题用搜索实现。
我们可以用三个数组 l , h , g g l,h,gg l,h,gg 来存放行,列和九宫格里数字的状态。
然后模拟数字填写过程,把一到九全部考虑一次。

C o d e Code Code

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int h[10][10],l[10][10],gg[10][10][10],a[10][10];
int w=0;
string T;
int check(int x)
{
    
    
	if(x<=3)
		return 1;
	if(x>3&&x<=6)
		return 2;
	if(x>6&&x<=9)
		return 3;
}
void dfs(int x,int y)
{
    
    
	if(w==1)
	  return;
	if(x>9&&y==1)
	 {
    
    
	 	for(int i=1; i<=9; i++)
	 	 for(int j=1; j<=9; j++)
	 	    cout<<a[i][j];
	 	cout<<endl;
	 	w=1;
	 	return;
	 }
	if(a[x][y]!=0)
	 {
    
    
	 	if(y==9)
	 	  dfs(x+1,1);
	 	else
	 	  dfs(x,y+1);
	 }
	else
	 for(int i=1; i<=9; i++)
	  {
    
    
	 	if(h[x][i]==0&&l[y][i]==0&&gg[check(x)][check(y)][i]==0)
	 	 {
    
    
	 	 	a[x][y]=i;
     	 	h[x][i]=1;
     	 	l[y][i]=1;
     	 	gg[check(x)][check(y)][i]=1;
     	 	if(y==9)
	 	      dfs(x+1,1);
	 	    else
	 	      dfs(x,y+1);
	 	    a[x][y]=0;
     	 	h[x][i]=0;
     	 	l[y][i]=0;
     	 	gg[check(x)][check(y)][i]=0;
	 	 }
	  }
}
int main()
{
    
    
    while(cin>>T)
     {
    
    
     	memset(a,0,sizeof(a));
        memset(h,0,sizeof(h));
     	memset(l,0,sizeof(l));
     	memset(gg,0,sizeof(gg));
     	if(T=="end")
     	  break;
     	for(int i=1; i<=9; i++)
     	 for(int j=1; j<=9; j++)
     	  {
    
    
     	 	if(T[(i-1)*9+j-1]>='1'&&T[(i-1)*9+j-1]<='9')
     	 	 {
    
    
     	 	 	a[i][j]=T[(i-1)*9+j-1]-48;
     	 	 	h[i][a[i][j]]=1;
     	 	 	l[j][a[i][j]]=1;
     	 	 	gg[check(i)][check(j)][a[i][j]]=1;
     	 	 }
     	  }
//     	for(int i=1; i<=9; i++)
//	 	 for(int j=1; j<=9; j++)
//	 	    cout<<a[i][j];
//	 	cout<<endl;
     	w=0;
     	dfs(1,1);
     }
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Jackma_mayichao/article/details/112135368