长草

【问题描述】小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。请告诉小明,k 个月后空地上哪些地方有草。【输入格式】输入的第一行包含两个整数 n, m。接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。<接下来包含一个整数 k。【输出格式】输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。【样例输入】
4 5
.g…

…g…

2
【样例输出】
gggg.
gggg.
ggggg
.ggg.
【评测用例规模与约定】对于 30% 的评测用例,2 <= n, m <= 20。对于 70% 的评测用例,2 <= n, m <= 100。对于所有评测用例,2 <= n, m <= 1000,1 <= k <= 1000。

要解题首先要理解题中所给提示,n行m列可以用二维数组表示,即arr[n][m],每个月长出的草是前一个月的空地中有草的土地的上下左右四个方向各延伸一个土地。即假设arr[x][y]是长草的土地,则在下个月有草的土地就是arr[x][y]、arr[x][y+1]、arr[x][y-1]、arr[x+1][y]、arr[x-1][y];其次要知道土地的大小是有限的,如果长草超出土地的边缘那么在超出边缘的延伸上便不会长草。
难点:1、判断长出的草是否为前一个月的草;2、数组越界问题
解决方法:1、如果用for循环在原来的数组的基础上进行长草,很难判断出长出的草是否为前一个月长出的草,为了避免这种情况发生,我创建一个新的二维数组来区别前一个月和当前月的长草情况;2、对于超出边缘的区域不再长草就会出现数组越界问题,我用的是最简单粗暴的解决方法判断他是否越界,如果越界就不再长草。但是这样做存在弊端,就是代码冗余。(后续可能会对这个进行进一步的修改)
这篇博客中有我对蓝桥杯输入格式的个人写法:
蓝桥杯输入格式
代码:

import java.util.Scanner;

/*【问题描述】小明有一块空地,他将这块空地划分为 n 行 m 列的小块,
 * 每行和每列的长度都为 1。
 * 小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
 * 这些草长得很快,每个月,草都会向外长出一些,
 * 如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,
 * 这四小块空地都将变为有草的小块。
 * 请告诉小明,k 个月后空地上哪些地方有草。
 * 【输入格式】输入的第一行包含两个整数 n, m。
 * 接下来 n 行,每行包含 m 个字母,表示初始的空地状态,
 * 字母之间没有空格。
 * 如果为小数点,表示为空地,
 * 如果字母为 g,表示种了草。
 * 接下来包含一个整数 k。
 * 【输出格式】输出 n 行,每行包含 m 个字母,
 * 表示 k 个月后空地的状态。
 * 如果为小数点,表示为空地,如果字母为 g,表示长了草。
 * 【样例输入】<br>4 5<br>.g...<br>.....<br>..g..<br>.....<br>2<br>
 * 【样例输出】<br>gggg.<br>gggg.<br>ggggg<br>.ggg.<br>
 * 【评测用例规模与约定】<br>对于 30% 的评测用例,2 &lt;= n, m &lt;= 20。<br>对于 70% 的评测用例,2 &lt;= n, m &lt;= 100。<br>对于所有评测用例,2 &lt;= n, m &lt;= 1000,1 &lt;= k &lt;= 1000。<br><br></p>
 * */

public class Text01 {
	public static void main(String[] args) {
		char[][]arr1 = new char[new Scanner(System.in).nextInt()][new Scanner(System.in).nextInt()];
		for(int i=0; i<arr1.length; i++) {
			char[] arr2 = new Scanner(System.in).nextLine().toCharArray();
			for(int j=0; j<arr1[i].length; j++) {
				arr1[i][j] = arr2[j];
			}
		}
		int a = new Scanner(System.in).nextInt();
		for(int i=0; i<a; i++) {
			arr1 = ZhangCao(arr1);
		}
		for(int i=0; i<arr1.length; i++) {
			for(int j=0; j<arr1[i].length; j++) {
				System.out.print(arr1[i][j]);
			}
			System.out.println();
		}
	}
	public static char[][] ZhangCao(char[][] arr1) {
		char[][] arr = new char[arr1.length][arr1[0].length];
		for(int i=0; i<arr.length; i++) {
			for(int j=0; j<arr[i].length; j++) {
				if(arr1[i][j]=='g' && i>0 && j>0 && i<arr.length-1 && j<arr[i].length-1) {
					arr[i][j-1] = arr[i][j+1] = arr[i-1][j] = arr[i+1][j] = arr[i][j] = 'g';					
				}else if(arr1[i][j]=='g' && i==0 && j>0 && i<arr.length-1 && j<arr[i].length-1) {
					arr[i][j-1] = arr[i][j+1] = arr[i+1][j] = arr[i][j] = 'g';
				}else if(arr1[i][j]=='g' && i>0 && j==0 && i<arr.length && j<arr[i].length) {
					arr[i][j+1] = arr[i-1][j] = arr[i+1][j] = arr[i][j] = 'g';
				}else if(arr1[i][j]=='g' && i>0 && j>0 && i==arr.length-1 && j<arr[i].length-1) {
					arr[i][j-1] = arr[i][j+1] = arr[i-1][j] = arr[i][j] = 'g';
				}else if(arr1[i][j]=='g' && i>0 && j>0 && i<arr.length-1 && j==arr[i].length-1) {
					arr[i][j-1] = arr[i-1][j] = arr[i+1][j] = arr[i][j] = 'g';
				}
			}
		}
		for(int i=0; i<arr.length; i++) {
			for(int j=0; j<arr[i].length; j++) {
				if(arr[i][j] != 'g') {
					arr[i][j] = '.';					
				}
			}
		}
		return arr;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值