【ybtoj 高效进阶 1.4】【深搜】数独游戏

【ybtoj 高效进阶 1.4】【深搜】数独游戏

题目

【ybtoj 高效进阶 1.4】【深搜】数独游戏_第1张图片


解题思路

用字符串输入
将其转换成数值放入数组a
数组l统计当前行数字的使用情况
数组r统计当前列数字的使用情况
数组f统计当前3*3方格数字的使用情况
枚举当前格可以填的数字


代码

#include
#include
#include
using namespace std;
int a[10][10],l[10][10],r[10][10],f[5][5][10],p;
string s;
int k(int x)
{
     
	if (x<4) return 1;
	if (x<7) return 2;
	return 3;
}
void dfs(int x,int y)
{
      
	 if (p) return;  //已经输出答案
	 if (x>9)  //
	 {
     
	 	for (int i=1;i<=9;i++)
	 	    for (int j=1;j<=9;j++)
	 	        printf("%d",a[i][j]);
	 	printf("\n");
	 	p=1;
	 	return;
	 }
	 if (a[x][y])
	 	if (y==9)
	 	   dfs(x+1,1);
	 	   else dfs(x,y+1);
	 for (int i=1;i<=9;i++)
	     if (!l[x][i]&&!r[y][i]&&!f[k(x)][k(y)][i]&&a[x][y]==0)  //判断是否能填
	     {
     
	     	a[x][y]=i;
	     	l[x][i]=r[y][i]=f[k(x)][k(y)][i]=1;
	     	if (y==9)
	 	       dfs(x+1,1);
	 	       else dfs(x,y+1);
	 	    l[x][i]=r[y][i]=f[k(x)][k(y)][i]=0;
	 	    a[x][y]=0;  //回溯
		 }
}
int main()
{
     
	while (cin>>s)
	{
      
		  if(s=="end")
		  	return 0;
	      p=0;
		  memset(l,0,sizeof(l));
		  memset(r,0,sizeof(r));
		  memset(f,0,sizeof(f));  //清0
		  for (int i=1;i<=9;i++)
		      for (int j=1;j<=9;j++)
		          if (s[(i-1)*9+j-1]!='.')
				  {
     
				     a[i][j]=s[(i-1)*9+j-1]-48;
		      	     l[i][a[i][j]]=1;
		      	     r[j][a[i][j]]=1;
		      	     f[k(i)][k(j)][a[i][j]]=1;  
			      }
		          else a[i][j]=0;  //预处理
		  dfs(1,1);         
	}
	return 0;
}

你可能感兴趣的:(DFS,ybtoj,深搜)