数独dfs

数独dfs

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

int row[10][10];   //记录某行 数k是否被使用 
int col[10][10];   //记录某列 数k是否被使用 
int sq[10][10];    //记录某格 数k是否被使用  1-9
char gg[15][15];

bool ok;

void dfs(int i,int j)
{
    
    
	if(ok==1)    //找到答案后停止所有搜索 
		return;
		
	if(i==10)   //  找到答案,输出数独 
	{
    
    
		ok=1;
		for(int p=1;p<=9;p++)
	 	{
    
    
	 		for(int q=1;q<=9;q++)
	 		{
    
    
	 			printf("%c",gg[p][q]);
			 }
			 printf("\n");
		}
		return ;
	}
	
	if(gg[i][j]>='1' && gg[i][j]<='9')   //当前不可写,直接 dfs(next)
	{
    
    
		if(j==9)
			dfs(i+1,1);
		else dfs(i,j+1);
		return;
	}
	
	for(int k=1;k<=9;k++)
	{
    
    
		if(!row[i][k] && !col[j][k] && !sq[((i-1)/3)*3+(((j-1)/3)+1)][k])
		{
    
    
			gg[i][j]='0'+k;
			row[i][k]++;
			col[j][k]++;
			sq[((i-1)/3)*3+(((j-1)/3)+1)][k]++;     //dfs  填写结果 
				
			if(j==9)
				dfs(i+1,1);
			else dfs(i,j+1);
			
			gg[i][j]='.';
			row[i][k]=0;
			col[j][k]=0;
			sq[((i-1)/3)*3+(((j-1)/3)+1)][k]=0; //注意还原,如果当前dfs不通,方便执行下个dfs 
		}
	}
}



int main()
{
    
    
	for(int i=1;i<=9;i++)
		for(int j=1;j<=9;j++)
		{
    
    
			cin>>gg[i][j];
			if(gg[i][j]!='.')
			{
    
    
				row[i][gg[i][j]-'0']++;
				col[j][gg[i][j]-'0']++;
				sq[((i-1)/3)*3+(((j-1)/3)+1)][gg[i][j]-'0']++;
			}
			
		}	
	dfs(1,1);
	
	
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45448563/article/details/113568946