hdu 3111

来源:互联网 发布:java 异常 throws 编辑:程序博客网 时间:2024/06/06 03:34

搜索的数独题目     用Judge函数去判断是否满足条件     还有就是深搜的基本步骤就是

   map[][]=i;  //       赋值

   dfs(k);//       继续搜索    

     if(ans)    return ;      //判断   

    map[][]=0;  //              还原之前的内容

    

}


这道题在搜索时 ,如果遇到错误的值就会使用map[][]=0;全部回溯,将之前所有的错误数据全部还原    

# include <stdio.h>char map[15][15];int vis[15][15];int x[150],y[150];int ans;int count;int Judge(int x,int y,int val){int i,j,a,b;for(i=0;i<9;i++)if(i!=x&&vis[i][y]==val)return 1;for(j=0;j<9;j++)if(j!=y&&vis[x][j]==val)return 1;for(a=0,i=x/3*3;a<3;a++,i++)for(b=0,j=y/3*3;b<3;b++,j++){if(i==x&&j==y)continue;if(vis[i][j]==val)return 1;}return 0;}void dfs(int k){int i;if(k>=count)  ans=1;if(ans)  return ;for(i=1;i<=9;i++){if(Judge(x[k],y[k],i)) continue;vis[x[k]][y[k]]=i;dfs(k+1);if(ans)return ;vis[x[k]][y[k]]=0;}return ;}int main (){int T,i,j;int mark=0,flag;scanf("%d",&T);while(T--){count=0;if(mark)scanf("%s",map[i]);for(i=0;i<9;i++)scanf("%s",map[i]);for(i=0;i<9;i++)for(j=0;j<9;j++)if(map[i][j]=='?'){vis[i][j]=0;x[count]=i;y[count]=j;count++;}elsevis[i][j]=map[i][j]-'0';flag=0;for(i=0;i<9;i++){for(j=0;j<9;j++)if(vis[i][j]&&Judge(i,j,vis[i][j])){flag=1;break;}if(flag)break;}ans=0;if(!flag){dfs(0);}if(mark)printf("---\n");if(ans){for(i=0;i<9;i++){for(j=0;j<9;j++){printf("%d",vis[i][j]);}printf("\n");}}elseprintf("impossible\n");mark=1;}return 0;}