poj2676解题报告

来源:互联网 发布:上海博物馆淘宝 编辑:程序博客网 时间:2024/04/25 18:54

题意:有一个9*9的格子 分成了9个3*3的小子格,一些位置上的已有一些数字。。现在要求你把没有数字的位置填上数,要求这个数没有出现在这个位置所在的行、列以及所在的子格

分析:

那么我们对于所有的未填写位置就可以进行一次dfs,对于每个位置枚举1~9九个数字看能不能填写,(能填写的就是符合题目的要求),对于行列比较容易,但是对于当前位置 (x,y) 所在的子格...借鉴了前辈的方法:如下:it=(x/3)*3,jt=(y/3)*3,那么 (it,jt) 就是当前位置坐在子格的左上角顶点, 可以任意列举几个点验证;;

那么上马:

#include<stdio.h>#include<string.h>int map[9][9];int flag[82][2];//用来标记没有填写的点坐标,因为最多只有81个格子int num;//没填写格子的个数bool judg(int x,int y,int k){int i,j;//进行列和行的判断for(i=0;i<9;i++){if(map[i][y]==k)return false;if(map[x][i]==k)return false;}//进行所在子格的判断int it=(x/3)*3,jt=(y/3)*3;//这里是根据x,y来计算(x,y)所在子格的左上角的点坐标for(i=0;i<3;i++)for(j=0;j<3;j++)if(map[i+it][j+jt]==k)return false;return true;}int dfs(int sum)//从没填写的子格数搜索,为0结束{if(sum<0)return 1;int x=flag[sum][0],y=flag[sum][1];for(int i=1;i<=9;i++)//将(x,y)这点从1到9遍历看能否填写其中的数字if(judg(x,y,i)){map[x][y]=i;if(dfs(sum-1)) return 1;map[x][y]=0;}return 0;}int main(){int T;int i,j;char c;scanf("%d",&T);getchar();while(T--){num=0;memset(flag,0,sizeof(flag));for(i=0;i<9;i++)for(j=0;j<9;j++){scanf("%c",&c);getchar();map[i][j]=c-'0';if(!map[i][j]){flag[num][0]=i;flag[num++][1]=j;}}dfs(num-1);for(i=0;i<9;i++){for(j=0;j<9;j++)printf("%d",map[i][j]);printf("\n");}}return 0;}


原创粉丝点击