标签:idt ini splay .com 思路 one blog close 问题:
1.数独 DFS
问题:用数字1-9填充该9×9的数据块,条件:空位置填数,该行、该列、该所在的3×3(黑线划分)小块,不得有重复出现的数字
思路:DFS
用三个二维数组分别存储:值为 1则说明出现过
r[i][x] 第 i 行 x 值 是否出现过
c[j][x] 第 j 列 x 值 是否出现过
b[k][x] 第 k 快(该9×9 的数独区由9块3×3的小区域组成) x 值是否出现过 :(i/3*3+j/3 这个很重要,用来判断该位置属于那个块)
定义一个结构体数组存放空点位置,每次DFS递归空点位置的下标,如果下标打过了空点的总数量,则递归结束。
写完记得 memset 三个数组。
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 struct P 5 { 6 int x,y; 7 } p[81]; 8 char s[9][9]; 9 int r[10][10],c[10][10],b[10][10]; 10 int ok,cut; 11 void init() 12 { 13 int k=0; 14 for(int i=0; i<9; i++) 15 for(int j=0; j<9; j++) 16 if(s[i][j]!=‘0‘) 17 r[i][s[i][j]-‘0‘]=c[j][s[i][j]-‘0‘]=b[i/3*3+j/3][s[i][j]-‘0‘]=1; 18 else 19 p[cut].x=i,p[cut].y=j,cut++; 20 } 21 int check(int x,int y,int v) 22 { 23 if(r[x][v]||c[y][v]||b[x/3*3+y/3][v])return 0; 24 return 1; 25 } 26 void print() 27 { 28 for(int i=0; i<9; i++) 29 { 30 for(int j=0; j<9; j++) 31 printf("%c",s[i][j]); 32 printf("\n"); 33 } 34 } 35 void dfs(int step) 36 { 37 if(step==cut) 38 { 39 ok=1; 40 print(); 41 return ; 42 } 43 int xx,yy; 44 for(int i=1; i<10; i++) 45 { 46 if(check(p[step].x,p[step].y,i)) 47 { 48 xx=p[step].x,yy=p[step].y; 49 r[xx][i]=c[yy][i]=b[xx/3*3+yy/3][i]=1; 50 s[xx][yy]=i+‘0‘; 51 dfs(step+1); 52 if(ok)return; 53 r[xx][i]=c[yy][i]=b[xx/3*3+yy/3][i]=0; 54 s[xx][yy]=‘0‘; 55 } 56 } 57 } 58 int main() 59 { 60 int T; 61 scanf("%d",&T); 62 while(T--) 63 { 64 memset(c,0,sizeof(c)); 65 memset(r,0,sizeof(r)); 66 memset(b,0,sizeof(b)); 67 cut=ok=0; 68 for(int i=0; i<9; i++) 69 scanf("%s",s[i]); 70 init(); 71 dfs(0); 72 } 73 return 0; 74 }
标签:idt ini splay .com 思路 one blog close 问题:
原文地址:http://www.cnblogs.com/A--Q/p/6675488.html