uva 11520

分类: 贪心

题意: 有一个n*n的格子,里面可能又字母,可能是'.'代表没字母,求出一种字母填法,使得从上到下,从左到右字典序最小

输入: 组数T,初始方阵

输出: 填好的方阵

 

解法: 关键在于理解题意

         只要满足从上到下从左到右字典序最小,那么就按照从上到下从左到右的顺序贪心填写

         每一次与四个方向比较

#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <queue>
using namespace std;

///宏定义
const int  INF = 990000000;
const int MAXN = 15;
const int maxn = MAXN;
///全局变量 和 函数
int n;
char maze[maxn][maxn];
char maxChar(char c1, char c2)
{
    if (c1 > c2)
        return c1;
    return c2;
}

void fillSquare()
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (maze[i][j] != '.')
                continue;
            for (char ss = 'A'; ss <= 'Z'; ss++)
            {
                if (i > 0 && ss == maze[i - 1][j])
                    continue;
                if (j < n - 1 && ss == maze[i][j + 1])
                    continue;
                if (i < n - 1 && ss == maze[i + 1][j])
                    continue;
                if (j > 0 && ss == maze[i][j - 1])
                    continue;
                maze[i][j] = ss;
                break;
            }
        }
    }
}
int main()
{
    ///变量定义
    int T;
    int cases = 1;
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            scanf("%s", maze[i]);
        }
        fillSquare();
        printf("Case %d:\n", cases++);
        for (int i = 0; i < n; i++)
        {
            printf("%s\n", maze[i]);
        }
    }

    ///结束
    return 0;
}

 

posted on 2013-09-23 10:38  小书包_Ray  阅读(144)  评论(0编辑  收藏  举报

导航