• 【Gym 100971A】Treasure Island


    题意

    题目链接
    给你一个地图,'#'代表水,'.'代表陆地,'?'代表擦去的地图,可能是'#'也可能是'.'。地图中本该只有一块相连的陆地,若只有一种方案则输出确定的地图。若有多种方案,则输出‘Ambiguous’,若无答案,则输出‘Impossible’。

    分析

    将所有‘.’进行dfs扫一遍,dfs时遇到的‘?’当作'.',因为被'#'包围的'?'一定代表‘#’。
    一边记录相连的陆地数量b,一边记录当前相连陆地的总格数s0。
    如果b==1,就对每个遇到过的'?',将其置为'#‘,再dfs一遍,如果扫到总格数小于s0-1,则有多种答案,否则就是一种答案。
    如果b>1,则是无答案。

    代码

    #include <bits/stdc++.h>
    #define N 55
    int n, m, a[N][N], u[N][N], x, y, b, s0, s, ok, fx[4] = {0, 0, 1, -1}, fy[4] = {1, -1, 0, 0};
    char c;
    void dfs(int x, int y)
    {
        if (u[x][y]) return;
        u[x][y] = 1;
        s++;
        if (a[x][y] == 2) a[x][y] = 3;
        for (int i = 0; i < 4; i++)
        {
            int nx = x + fx[i];
            int ny = y + fy[i];
            if (a[nx][ny])
                dfs(nx, ny);
        }
    }
    int main()
    {
        scanf("%d%d ", & n, & m);
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                c = getchar();
                if (c == '.') a[i][j] = 1;
                else if (c == '?') a[i][j] = 2;
            }
            getchar();
        }
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                if (a[i][j] == 1 && !u[i][j])
                {
                    b++;
                    dfs(i, j);
                    x = i;
                    y = j;
                }
        if(b == 1)
        {
            s0 = s;
            for (int i = 1; i <= n && !ok; i++)
                for (int j = 1; j <= m && !ok; j++)
                    if (a[i][j] == 3 )
                    {
                        memset(u, 0, sizeof u);
                        s = a[i][j] = 0;//? => #
                        dfs(x, y);
                        if(s == s0 - 1 )
                            ok = 1;
                        a[i][j] = 1;
                    }
            if (ok)
                printf("Ambiguous");
            else
                for (int i = 1; i <= n; i++)
                {
                    for (int j = 1; j <= m; j++)
                        if (a[i][j] == 1) printf(".");
                        else printf("#");
                    printf("
    ");
                }
        }
        else printf("Impossible");
        return 0;
    }
  • 相关阅读:
    11.正则表达式的一些简单应用
    10.JavaScript距离生日还有多少天、根据出生年月日计算年龄、打印当前月份每天的星期
    9.JavaScript获取当前时间,返回格式年-月-日 时:分:秒
    8.JavaScript获取一个从最小值到最大值的随机数
    7.JavaScript数组乱序排序
    6.JavaScript中的new.target
    5.JavaScript自定义数组排序
    2-9 随机模块
    2-8 四则运算
    1-22Python练习题1-1
  • 原文地址:https://www.cnblogs.com/flipped/p/5499762.html
Copyright © 2020-2023  润新知