zoukankan      html  css  js  c++  java
  • 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:
    ", 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: }
  • 相关阅读:
    一本通1331后缀表达式的值
    一本通1198 逆波兰表达式
    一本通1311 求逆序对(归并排序应用)
    快速排序
    一本通1310 车厢重组(冒泡排序,类似逆序对)
    一本通1186 出现次数超过一半的数(类似桶排序)
    一本通1216 红与黑 (代码没有参考任何博客,完全是自己写的,我搜索出山了!!!)
    一本通1222 放苹果
    一本通 1212 LETTERS
    一本通1215 迷宫
  • 原文地址:https://www.cnblogs.com/wuhenqs/p/3234912.html
Copyright © 2011-2022 走看看