第十一届蓝桥杯校内模拟赛JavaB组 空地种草

小明有一块空地, 他将这块空地划分为n行m列的小块,每行和每列的长度都为1。
小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月, 草都会向外长出一些,如果一个小块种了草,则它将向自己的上,下、 左、右四小块空地扩展,这四小块空地都将变为有草的小块。
请告诉小明,k个月后空地上哪些地方有草。

输入格式:
输入的第一行包含两个整数m,n。
接下来n行,每行包含m个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为g,表示种了草。
接下来包含一个整数k.

输出格式:
输出n行,每行包含m个字母,表示k个月后空地的状态。如果为小数点,表示为空地,如果字母为g表示长了草。

样例输入:

4 5
.g…

…g.

2

样例输出:

gggg.
ggggg
.gggg
…ggg

package 蓝桥杯模拟赛;

import java.util.Scanner;

//找草、种草
public class _09空地种草 {
	
	static int n,m;
	static int vis[][];
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		vis = new int[n][m];
		sc.nextLine();
		char map[][] = new char[n][m];
		for(int i = 0; i < n; i++) {//录入地图
			String s = sc.nextLine();
			map[i] = s.toCharArray();
		}
		int k = sc.nextInt();
		
		for(int i = 0; i < k; i++) {
			vis = new int[n][m];
			
			for(int j = 0; j < n; j++) {
				for(int u = 0; u < m; u++) {
					if(map[j][u] == 'g' && vis[j][u] == 0) {
						vis[j][u] = 1;
						dfs(j,u,map);
					}
				}
			}
		}
		
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				System.out.print(map[i][j]);
			}
			System.out.println();
		}
	}

	
	private static void dfs(int i, int j, char[][] map) {
		int dir[][] = {{0,1},{0,-1},{-1,0},{1,0}};
		for(int u = 0; u < 4; u++) {
			int nx = i + dir[u][0];
			int ny = j + dir[u][1];
			if(nx >= 0 && nx < map.length && ny >= 0 && ny < map[0].length && vis[nx][ny] == 0) {
				if(map[nx][ny] == '.') {
					vis[nx][ny] = 1;
					map[nx][ny] = 'g';
				}else if(map[nx][ny] == 'g') {
					vis[nx][ny] = 1;
					dfs(nx,ny,map);
				}
			}
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值