POJ 2676
Posted 一个_小菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2676相关的知识,希望对你有一定的参考价值。
http://poj.org/problem?id=2676
深搜的题目。
题意呢就是一个数独的游戏,应该都知道规则。
思路:我的思路很简单,就是用数组来判断某个数字是否可以使用,而每一个数字都由三个条件来限制它,分别是行和列,和其所在的9宫格里面,是不能有重复的。
如果有重复的,则不能使用,甚至都不能尝试。
代码写的也比较渣。还有这个题的数据应该不深,从0,0搜和从8,8开始搜,时间差距非常大,我的从0,0开始是1200Ms,从8,8是16Ms.
这是数据的问题。
1 #include <stdio.h> 2 #include <string.h> 3 4 5 int sodu[9][9],flog; 6 7 char a[9][9]; 8 9 bool h[9][10],s[9][10],cube[9][10]; //h代表行,s代表列,cube代表数字所在的的是哪一个9宫格。 10 11 int jud(int x) //用来判断数字是在哪一个9宫格,我的分区是按从0 1 2/3 4 5/6 7 8来分的。 12 { 13 if(x>=3&&x<6) return 3; 14 if(x>=6) return 6; 15 return 0; 16 } 17 18 void bfs(int x,int y) 19 { 20 for(int q=8;q>=0;q--) //这个是来判断是否搜索成功。 21 { 22 flog=1; 23 for(int p=8;p>=0;p--) 24 { 25 if(sodu[q][p]==0) {flog=2;break;} 26 if(flog&&p==0&&q==0) flog=0; 27 } 28 if(flog==2) break; 29 } 30 for(int i=8;i>=0&&flog;i--) 31 for(int j=8;j>=0;j--) 32 { 33 if(sodu[i][j]==0) 34 { 35 for(int k=1;k<10;k++) 36 { 37 if(h[i][k]&&s[j][k]&&cube[j/3+jud(i)][k]) 38 { 39 sodu[i][j]=k; 40 h[i][k]=false; 41 s[j][k]=false; 42 cube[j/3+jud(i)][k]=false; 43 bfs(8,8); 44 if(flog==0)return; 45 h[i][k]=true; 46 s[j][k]=true; 47 cube[j/3+jud(i)][k]=true; 48 } 49 } 50 sodu[i][j]=0; //这里记得要归0,不然回溯的时候,下一次不会再这个数值。 51 if(sodu[i][j]==0)return; 52 } 53 } 54 } 55 56 int main() 57 { 58 int n; 59 scanf("%d",&n); 60 while(n--) 61 { 62 for(int i=0;i<9;i++) 63 scanf("%s",a[i]); 64 for(int i=0;i<9;i++) 65 for(int j=0;j<9;j++) 66 sodu[i][j]=a[i][j]-‘0‘; 67 memset(h,true,sizeof(h)); 68 memset(s,true,sizeof(s)); 69 memset(cube,true,sizeof(cube)); 70 for(int i=0;i<9;i++) 71 for(int j=0;j<9;j++) 72 { 73 if(sodu[i][j]!=0) 74 { 75 h[i][sodu[i][j]]=false; 76 s[j][sodu[i][j]]=false; 77 cube[j/3+jud(i)][sodu[i][j]]=false; 78 } 79 } 80 flog=1; 81 bfs(0,0); 82 for(int i=0;i<9;i++) 83 { 84 for(int j=0;j<9;j++) 85 printf("%d",sodu[i][j]); 86 printf("\n"); 87 } 88 89 } 90 return 0; 91 }
以上是关于POJ 2676的主要内容,如果未能解决你的问题,请参考以下文章