uva 11520 Fill the Square
https://vjudge.net/problem/UVA-11520
题意:
给出一个n * n规模的网格,其中有些格子填充了大写字母,有些格子是空的。现在要把剩下的格子全部填充上大些字母,要求相邻的格子的字母不能相同(相邻的格子为有公共边的格子),并且填充完之后字典序最小,字典序是行优先。
思路:
把周围用过的字母统计一下,之后吧没用过的最小的给它填上就ok。
QAQ,因为忘记这个格子没有填充过才能填充,所以wa了好多发,真不应该!!!切记仔细与专注。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 4 bool a[50]; 5 char b[15][15]; 6 7 int main() 8 { 9 int t; 10 11 scanf("%d",&t); 12 13 int cas = 0; 14 15 while (t--) 16 { 17 int n; 18 19 scanf("%d",&n); 20 21 for (int i = 0;i < n;i++) 22 scanf("%s",b[i]); 23 24 for (int i = 0;i < n;i++) 25 for (int j = 0;j < n;j++) 26 { 27 memset(a,0,sizeof(a)); 28 29 if (b[i][j] != '.') continue; 30 31 if (i - 1 >= 0) 32 { 33 if (b[i-1][j] != '.') 34 { 35 char x = b[i-1][j]; 36 a[x-'A'] = 1; 37 } 38 } 39 if (j - 1 >= 0) 40 { 41 if (b[i][j-1] != '.') 42 { 43 char x = b[i][j-1]; 44 a[x-'A'] = 1; 45 } 46 } 47 if (i + 1 < n) 48 { 49 if (b[i+1][j] != '.') 50 { 51 char x = b[i+1][j]; 52 a[x-'A'] = 1; 53 } 54 } 55 if (j + 1 < n) 56 { 57 if (b[i][j+1] != '.') 58 { 59 char x = b[i][j+1]; 60 a[x-'A'] = 1; 61 } 62 } 63 64 char x; 65 66 for (int k = 0;k <= 'Z' - 'A';k++) 67 { 68 if (!a[k]) 69 { 70 x = 'A' + k; 71 break; 72 } 73 } 74 75 b[i][j] = x; 76 } 77 78 printf("Case %d:\n",++cas); 79 80 81 for (int i = 0;i < n;i++) 82 printf("%s\n",b[i]); 83 } 84 85 return 0; 86 }
康复训练中~欢迎交流!