C - Sudoku+dfs

来源:互联网 发布:管家婆普及版数据恢复 编辑:程序博客网 时间:2024/06/10 13:01
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;


int f[10][10];
 
int position[100][3];
int ks;
int ok;


int main()
{

int dfs(int r,int c,int posi);
 
int i,j,t,kk,startx,starty;
scanf("%d",&t);getchar();
for (kk=1;kk<=t;kk++)
{
 
 
ks=0;
int start;
char tmp;

for (i=1;i<=9;i++)
{
for (j=1;j<=9;j++)
{
scanf("%c",&tmp);
f[i][j]=tmp+1-'1';


if (f[i][j]==0)

ks++;
position[ks][1]=i; 
position[ks][2]=j;


getchar();




dfs(position[ks][1],position[ks][2],ks); 
for (i=1;i<=9;i++)
{
for (j=1;j<=9;j++)
{
printf("%d",f[i][j]);


printf("\n");

ok=0;
}

return 0;



 
 
 


  
 
int dfs(int r,int c,int posi)
{
bool vis[10];
memset(vis,true,sizeof(vis));

int i,j,w;
 
int rr,cc;
 
 
for (i=1;i<=9;i++)
{
 
vis[f[i][c]]=false;
}


for (i=1;i<=9;i++)

vis[f[r][i]]=false;
}


    
  
for(i=(r-1)/3*3+1;i<=(r-1)/3*3+3;i++)          //巧处一,用求商法得到9*9中3*3,
{
for(j=(c-1)/3*3+1;j<=(c-1)/3*3+3;j++)

if (i==r &&j==c) continue;

vis[f[i][j]]=false;   //巧处二,用哈希法  //对BFS,DFS中判断是否legal的地方以后改为先用hash保存结果再直接判断如果只是一句话判断的函数,就可以用
}
}






for (w=1;w<=9;w++)
{
if ( vis[w] )
{
f[r][c]=w;



        if (posi==1){ ok=1; return 0;  




dfs(position[posi-1][1],position[posi-1][2],posi-1); 
if (ok==1) {return 0;} 
f[r][c]=0;
}

}





return 0;
0 0
原创粉丝点击