Codeforces - 377A - Maze

发布于 2024-05-12 13:49:59 字数 2728 浏览 14 评论 0

题目大意

就是在一个 maze 中,有 empty cell ( . ) 和 wall ( # ),现在要你将 k. 变成 X ,使得其他 . 还能连通。

解析

反过来思考,设 . 的数目为 emptyNum ,直接搜索到任意一条 emptyNum - k. 的连通路径即可,其余的 k 个点就是答案。

import java.io.*;
import java.util.Scanner;

public class Main {

    static final int[] dx = {-1, 0, 1, 0};
    static final int[] dy = {0, 1, 0, -1};

    static int n;
    static int m;
    static int k;
    static char[][] G;
    static int emptyNum;
    static int count;
    static boolean isFind;

    static boolean check(int i, int j) {
        return i >= 0 && i < n && j >= 0 && j < m;
    }

    static void dfs(int i, int j) {
        if (count == emptyNum - k) { //already find
            isFind = true;
            return;
        }
        count++;
        G[i][j] = '*';
        for (int k = 0; k < 4; k++) {
            int ni = i + dx[k];
            int nj = j + dy[k];
            if (check(ni, nj) && G[ni][nj] == '.')
                dfs(ni, nj);
        }
    }

    public static void main(String[] args) {

        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        PrintStream out = System.out;
        n = cin.nextInt();
        m = cin.nextInt();
        k = cin.nextInt();
        G = new char[n][m];

        for (int i = 0; i < n; i++) {
            String str = cin.next();
            for (int j = 0; j < m; j++) {
                if (str.charAt(j) == '.')
                    emptyNum++;
                G[i][j] = str.charAt(j);
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (G[i][j] == '.') {
                    dfs(i, j);
                    if (isFind)
                        break;
                }
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (G[i][j] == '.')
                    G[i][j] = 'X';
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (G[i][j] == '*')
                    G[i][j] = '.';
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                out.print(G[i][j]);
            }
            out.println();
        }
        out.println();
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

愁以何悠

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

qq_E2Iff7

文章 0 评论 0

Archangel

文章 0 评论 0

freedog

文章 0 评论 0

Hunk

文章 0 评论 0

18819270189

文章 0 评论 0

wenkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文