放格填数 数独
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 const int maxn = 6; 5 int table[maxn][maxn]; 6 int hash_col[maxn][maxn], hash_row[maxn][maxn], hash_gro[maxn][maxn]; 7 int gro_id[maxn][maxn]; 8 int cas = 0; 9 void next_pos(int& r, int& c) 10 { 11 if(5 == c)//这里写成了if(6 == c),害得我调了2个多小时 12 { 13 r ++; c = 0; 14 } 15 else 16 { 17 c ++; 18 } 19 } 20 void dfs(int r, int c) 21 { 22 if(r >= 6) 23 { 24 printf("%d\n", ++ cas); 25 for(int i = 0; i < 6; i ++) 26 { 27 for(int j = 0; j < 6; j ++) 28 { 29 printf(j == 0 ? "%c" : " %c", 'A' + table[i][j]); 30 } 31 printf("\n"); 32 } 33 return ; 34 } 35 int nr = r, nc = c; 36 next_pos(nr, nc); 37 if(-1 == table[r][c]) 38 { 39 for(int i = 0; i < 6; i ++) 40 { 41 int z = gro_id[r][c]; 42 if(hash_row[r][i] || hash_col[c][i] || hash_gro[z][i]) 43 continue; 44 //modify the state value 45 table[r][c] = i; 46 hash_row[r][i] = hash_col[c][i] = hash_gro[z][i] = 1; 47 dfs(nr, nc); 48 49 //recover the state value 50 table[r][c] = -1; 51 hash_row[r][i] = hash_col[c][i] = hash_gro[z][i] = 0; 52 } 53 } 54 else 55 { 56 dfs(nr, nc); 57 } 58 } 59 int main(void) 60 { 61 freopen("data.txt", "r", stdin); 62 memset(table, -1, sizeof(table)); 63 for(int i = 0; i < 6; i ++) 64 { 65 char str[maxn + 1]; 66 scanf("%s", str); 67 for(int j = 0; j < 6; j ++) 68 { 69 gro_id[i][j] = str[j] - '0'; 70 } 71 } 72 int n; 73 scanf("%d", &n); 74 char tmp[5]; 75 while(n --) 76 { 77 scanf("%s", tmp); 78 int r = tmp[0] - '0', c = tmp[1] - '0'; 79 int v = tmp[2] - 'A'; 80 int z = gro_id[r][c]; 81 table[r][c] = v; 82 hash_row[r][v] = hash_col[c][v] = hash_gro[z][v] = 1; 83 84 } 85 dfs(0, 0); 86 return 0; 87 }
1 #include<stdio.h> 2 3 int bj_r[6][6],bj_c[6][6],bj_q[6][6];//分别用来标记行、列和划分的区域中的字母是否已用 4 int in[6][6],out[6][6];//分别表示输入的表格和生成的数组表格 5 int count=1;//计数器 6 7 void dfs(int r,int c) 8 { 9 int i,j,nr,nc,x; 10 if(r==6)//数组从0-5,6说明已经填满 11 { 12 printf("%d\n",count++);//计数器加一,输出 13 for(i=0;i<6;i++) 14 { 15 for(j=0;j<6;j++) 16 printf("%c ",'A'+out[i][j]); 17 printf("\n"); 18 } 19 return; 20 } 21 //nr、nc是确定下个填充的位置 22 if(5==c) 23 { 24 nr=r+1; 25 nc=0; 26 } 27 else 28 { 29 nr=r; 30 nc=c+1; 31 } 32 33 if(-1==out[r][c])//该位置可以填充 34 { 35 for(i=0;i<6;i++)//从A-E尝试填充 36 { 37 x=in[r][c]; 38 if(bj_r[r][i]||bj_c[c][i]||bj_q[x][i])//行、列和划分的区域中的字母有一个或多个已用则退出 39 continue; 40 //搜索 41 out[r][c]=i; 42 bj_r[r][i]=bj_c[c][i]=bj_q[x][i]=1; 43 dfs(nr,nc); 44 45 bj_r[r][i]=bj_c[c][i]=bj_q[x][i]=0; 46 out[r][c]=-1; 47 // 48 } 49 } 50 else 51 dfs(nr,nc); 52 } 53 54 int main() 55 { 56 int i,j,n,r,c,x,z; 57 char inc[7]; 58 for(i=0;i<6;i++)//输入 59 { 60 scanf("%s",inc); 61 for(j=0;j<6;j++) 62 { 63 in[i][j]=inc[j]-'0'; 64 out[i][j]=-1; 65 } 66 } 67 scanf("%d",&n); 68 while(n--) 69 { 70 scanf("%s",inc); 71 r=inc[0]-'0'; 72 c=inc[1]-'0'; 73 z=inc[2]-'A';//用数字便于运算和存储 74 x=in[r][c];//x表示输入的数所在的区域 75 bj_r[r][z]=bj_c[c][z]=bj_q[x][z]=1;//标记该区域中的第z号字母已经被用 76 out[r][c]=z; 77 } 78 dfs(0,0);//搜索 79 return 0; 80 }