UVa 11520 Fill the Square 填充正方形
在一个 n * n 网格中填了一些大写字母,你的任务是把剩下的格子中也填满大写字母,使得任意两个相邻格子(即有公共边的格子)中的字母不同。如果有多重填法,则要求按照从上到下,从左到右的顺序把所有格子连接起来得到的字符串的字典序应该尽量小。
直接暴力走起就OK。因为,需要填的格子最多就是 A、B、C、D、E 这五个字母。所以直接暴力也就 O(n2)
因为要保证字符串的字典序最小,所以就从第一行第一列开始,一行一行的暴就搞定了。其他的就不说了,简单的水题。
附AC代码:
1: #include <stdio.h>
2: #include <math.h>
3: #include <iostream>
4: #include <cstdarg>
5: #include <algorithm>
6: #include <string.h>
7: #include <stdlib.h>
8: #include <string>
9: #include <list>
10: #include <vector>
11: #include <map>
12: #define LL long long
13: #define M(a) memset(a, 0, sizeof(a))
14: using namespace std;
15:
16: void Clean(int count, ...)
17: {
18: va_list arg_ptr;
19: va_start (arg_ptr, count);
20: for (int i = 0; i < count; i++)
21: M(va_arg(arg_ptr, int*));
22: va_end(arg_ptr);
23: }
24:
25: char buf[19][19];
26:
27: char Deal(int a, int b)
28: {
29: for (char tmp = 'A'; tmp <= 'Z'; tmp++)
30: {
31: if (buf[a - 1][b] == tmp) continue;
32: else if (buf[a + 1][b] == tmp) continue;
33: else if (buf[a][b - 1] == tmp) continue;
34: else if (buf[a][b + 1] == tmp) continue;
35: else return tmp;
36: }
37: }
38:
39: int main()
40: {
41: int T, n, cnt = 1;
42: scanf("%d", &T);
43: while(T--)
44: {
45: scanf("%d", &n);
46: Clean(1, buf);
47: char *input = &buf[1][1];
48: for (int i = 1; i <= n; i++)
49: {
50: input = &buf[i][1];
51: scanf("%s", input);
52: }
53: for(int i = 1; i <= n; i++)
54: {
55: for (int j = 1; j <= n; j++)
56: {
57: if (buf[i][j] == '.')
58: buf[i][j] = Deal(i, j);
59: }
60: }
61: printf("Case %d:\n", cnt++);
62: for(int i = 1; i <= n; i++)
63: {
64: for (int j = 1; j <= n; j++)
65: printf("%c", buf[i][j]);
66: puts("");
67: }
68: }
69: return 0;
70: }