uva11520 填充正方形

在一個n x n的網格中填了一些大寫字母,要求把剩下的格子也填上大寫字母,使得任意兩個相鄰格子的字母不同。
如果有多個解,按要求從上到下、從左到右的順序把所有格子連接起來的字典序最小。

分析:
1.“從上到下、從左到右”其實就是把每行看成一個字符串,然後從上到下連接,得到一個長長的字符串。所以我們只需要從左到右、從上到下依次給空格填上最小可能的字母即可。
2.這裏直接暴力就可以。

#include<cstdio>
#include<cstring>

const int maxn = 10 + 5;
char grid[maxn][maxn];
int n;

int main()
{
    int T;
    scanf("%d", &T);
    for (int kase = 1; kase <= T; kase++)
    {
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
            scanf("%s", grid[i]);
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                if (grid[i][j] == '.')    //沒有填過字母的
                {
                    for (char ch = 'A'; ch <= 'Z'; ch++)
                    {
                        bool ok = true;
                        if (i > 0 && grid[i - 1][j] == ch)
                            ok = false;
                        if (i < n - 1 && grid[i + 1][j] == ch)
                            ok = false;
                        if (j > 0 && grid[i][j - 1] == ch)
                            ok = false;
                        if (j < n - 1 && grid[i][j + 1] == ch)
                            ok = false;
                        if (ok)
                        {
                            grid[i][j] = ch;
                            break;
                        }
                    }
                }
        printf("Case %d:\n", kase);
        for (int i = 0; i < n; i++)
            printf("%s\n", grid[i]);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章