第十一届蓝桥杯校内模拟赛javaB组第八题解析(种草)

第八题

问题描述
  小明有一块空地,他将这块空地划分为 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。
分析:
创建二维数组先存取,然后判断点和g的数量,点赋值成0,g赋值成1。接下来进行月份的判断并且把长草的格子赋值为1存放在事先准备好的临时数组p2中,把临时数组的值赋给a数组在月份的循环下再次循环长草。最后临时数组中为1的是g,0的是点进行输出。
代码:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		int m = input.nextInt();
		int[][] a = new int[n][m];
		int[][] p2 = new int[n][m];
		int temp = 1;
		String[][] ss = new String[n][m];
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				ss[i][j] = input.next();
			}
		}
		int k = input.nextInt();
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				if(ss[i][j].equals(".") ) {
					a[i][j] = 0;
				}else if(ss[i][j].equals("g")) {
					a[i][j] = 1;
				}
			}
		}
		while(temp <= k) {
			for(int x = 0; x < n; x++) {
				for(int y = 0; y < m; y++) {
					if(a[x][y] == 1) {
						p2[x][y] = 1;
						if(x == 0) {
							if(y == 0) {
								p2[x][y+1] = 1;//you
								p2[x+1][y] = 1;//xia	
							}else if(y == m-1){
								p2[x][y-1] = 1;//zuo
								p2[x+1][y] = 1;//xia
							}else {
								p2[x][y-1] = 1;//zuo
								p2[x+1][y] = 1;//xia
								p2[x][y+1] = 1;//you
							}
						}else if(x == n-1) {
							if(y == 0) {
								p2[x-1][y] = 1;//shang
								p2[x][y+1] = 1;//you
							}else if(y == m-1) {
								p2[x][y-1] = 1;//zuo
								p2[x-1][y] = 1;//shang
							}else {
								p2[x][y-1] = 1;//zuo
								p2[x-1][y] = 1;//shang
								p2[x][y+1] = 1;//you
							}	
						}else {
							p2[x][y-1] = 1;//zuo
							p2[x-1][y] = 1;//shang
							p2[x][y+1] = 1;//you
							p2[x+1][y] = 1;//xia
						}
					}
				}
			}
			for(int x = 0; x < n; x++) {
				for(int y = 0; y < m; y++) {
					a[x][y] = p2[x][y];
				}
			}
			temp++;
		}
		for(int x = 0; x < n; x++) {
			for(int y = 0; y < m; y++) {
					if(p2[x][y] == 1) {
						System.out.print("g");
					}else {
						System.out.print(".");
					}
			}
		System.out.println();
		}
	}
}

你可能感兴趣的:(算法)