Acwing1113. 红与黑

news/2024/7/3 0:57:13

Problem: Acwing1113. 红与黑

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这是一道经典的洪水填充问题,可以使用dfs搜索和bfs搜索来解决。 ′ . ′ : '.' : .:表示黑色瓷砖,‘#’:表示红色瓷砖,‘@’表示黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。我们可以填充所有的黑色瓷砖,然后统计黑色瓷砖的个数。

解题方法

首先,遍历所有的瓷砖记录起始位置,将起始位置’@‘标记为’.‘,便于后面进行计算。
然后从起始位置开始进行dfs,把起始位可以延伸到的位置全部标记成’H’。
最后遍历整块区域统计’H’个数,输出答案即可。

复杂度

时间复杂度:

假设砖块的个数为N,每个砖块最多被遍历4次,所以时间复杂度为 O ( N ) O(N) O(N)

空间复杂度:

使用了一个二维数组来存储砖块的状态,所以空间复杂度为 O ( N ) O(N) O(N)

Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static StreamTokenizer sr = new StreamTokenizer(in);
	static int MAXN = 25;
	static char[][] matrix = new char[MAXN][MAXN];
	static int w, h;

	public static void main(String[] args) throws IOException {
		while (true) {
			w = nextInt();
			h = nextInt();
			if(w == 0 || h == 0) {
				return;
			}
// 			in.readLine();
			for (int i = 0; i < h; i++) {
				matrix[i] = in.readLine().toCharArray();
			}
			int sx = 0;
			int sy = 0;
			for (int i = 0; i < h; i++) {
				for (int j = 0; j < w; j++) {
					if (matrix[i][j] == '@') {
						sx = i;
						sy = j;
						matrix[i][j] = '.';
					}
				}
			}
			dfs(sx, sy); // 对所有的黑色砖块进行填充 'H'
			int res = 0;
			for (int i = 0; i < h; i++) {
				for (int j = 0; j < w; j++) {
					if (matrix[i][j] == 'H') {
						res++;
					}
				}
			}
			out.println(res);
			out.flush();
		}
		
	}

	private static void dfs(int sx, int sy) {
		// TODO Auto-generated method stub
		if (sx < 0 || sx >= h || sy < 0 || sy >= w || matrix[sx][sy] != '.') {
			return;
		}
		matrix[sx][sy] = 'H';
		dfs(sx + 1, sy);
		dfs(sx - 1, sy);
		dfs(sx, sy + 1);
		dfs(sx, sy - 1);

	}

	static int nextInt() throws IOException {
		sr.nextToken();
		return (int) sr.nval;
	}

}

http://lihuaxi.xjx100.cn/news/2108902.html

相关文章

算法系列--递归

一.如何理解递归 递归对于初学者来说是一个非常抽象的概念,笔者在第一次学习时也是迷迷糊糊的(二叉树遍历),递归的代码看起来非常的简洁,优美,但是如何想出来递归的思路或者为什么能用递归这是初学者很难分析出来的 笔者在学习的过程中通过刷题,也总结出自己的一些经验,总结来…

vue3 几种实现点击复制链接的方法

vue3 几种实现点击复制链接的方法 环境&#xff1a;vue3tselment plus 目的&#xff1a;常用到的地方就是点击复制分享链接功能 1.复制当前页面链接&#xff0c; <template><div class"news" style"margin-top: 30px"><el-button type&q…

首页效果炫酷的wordpress免费主题模板

视频背景免费WP主题 简洁大气的视频背景wordpress主题&#xff0c;找大视频背景的主题可以看看这个。 https://www.wpniu.com/themes/193.html 红色全屏大图WP主题 非常经典的一款免费wordpress主题&#xff0c;红色全屏大图满足多行业使用。 https://www.wpniu.com/themes…

攻防实战 | 记一次nacos到接管阿里云百万数据泄露

在某次攻防当中&#xff0c;通过打点发现了一台nacos&#xff0c;经过测试之后发现可以通过弱口令进入到后台&#xff0c;可以查看其中的配置信息 通过翻看配置文件&#xff0c;发现腾讯云的AK,SK泄露&#xff0c;以及数据库的账号密码。操作不就来了么&#xff0c;直接上云&am…

String类型详解

1. Java为何要创造String类 在C语言中,是没有String这个类型的,通常使用字符数组中存放一个个字符,再加上最后一个\0来表示/存放一个字符串.也可以使用一个字符指针指向字符串的首元素,直到遇到\0停止,再加上C语言头文件string.h中封装的函数,对于字符串的操作已经够用了. Java…

计算机组成原理(超详解!!) 第二节 数据的存储

1. 数据与文字的表示方法 1.数据格式 选择数的表示时要考虑的因素&#xff1a; 要表示的数的类型&#xff1a;决定表示方式 可能遇到的数值范围&#xff1a;确定存储、处理能力 数值的精确度&#xff1a;处理能力相关 数据的存储、处理所需的硬件代价&#xff1a;造价高低…

基于springboot+vue的中山社区医疗综合服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

速通汇编(一)debug六种命令使用,四个通用寄存器

一&#xff0c;使用DOSBox模拟汇编环境 打开DOSBox后输入命令【mount c masm的绝对路径】这步是绑定虚拟C盘&#xff0c;然后【C:】切换成C盘便可在此环境下练习汇编 二&#xff0c;debug是什么东西&#xff1f;怎么使用 (一)什么是 Debug? Debug是DOS、Windows都提供的实模式…