問題説明
土地の暁片は、彼が小さなn行m列、行ごとにこの空間を分割し、各列の長さは1です。
暁明は、それらのいくつかの小さなクリアを選んだ、植え草や他の小片は、オープンスペースのまま。
草は毎月、非常に速く成長し、草の小片が植えられた場合には草のいくつかは、出て成長する、それがアップ所有することになり、下、左、右の4つの小さなオープンスペースの拡張を、四つの小クリアそれは草の小片になります。
k個の数ヶ月後にオープンスペース上の草があるどのような場所、暁明を教えてください。
入力フォーマット
入力の最初の行のは、二つの整数N、Mを含有します。
続いてN行は、m個の文字を含む各行は、オープンスペースは、文字の間にスペースが存在しない、初期状態を示しています。小数点場合は、手紙gの場合、草の種類を表し、オープンスペースとして表現されます。
次は、整数kを含んでいます。
出力フォーマット
出力N行、M個の文字を含む各行は、kは状態空間ヶ月を表します。文字gは、長い草を表す場合は小数点場合は、オープンスペースとして表現されます。
サンプル入力
4. 5
.G ...
...
... ... G
...
2
サンプル出力
GGGG。
GGGG。
GGGGG
.ggg。
例スケールを有するとレビュー契約
、2 <= N、M <実施例中30%による評価のため = 20。
実施例中70%による評価のため、2 <= N、M < = 100。
評価のためのすべてのユースケース、2 <= N、M <= 1000,1 <= K <= 1000。
package 第十三次模拟;
import java.util.Scanner;
public class Demo9草地 {
public static int[][] bool;
public static int[] start;
public static int[] end;
public static char[][] num ;
public static int k = 0, n = 0, m = 0;
public static int[] x = { 0, 1, 0, -1 };
public static int[] y = { 1, 0, -1, 0 };
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
num = new char[n][m];
for (int i = 0; i < n; i++) {
String s = sc.next();
num[i] = s.toCharArray();
}
k = sc.nextInt();
sc.close();
start = new int[m * n];
end = new int[m * n];
int temp = 0;
bool = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (num[i][j] == 'g') {
start[temp] = i;
end[temp++] = j;
}
else{
bool[i][j]=-1;
}
}
}
for (int i = 0; i < temp; i++) {
dfs(start[i],end[i],k);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j <m; j++) {
System.out.print(num[i][j]);
}
System.out.println();
}
}
public static void dfs(int xx, int yy, int kk) {
bool[xx][yy]=kk;
num[xx][yy]='g';
for (int i = 0; i < 4; i++) {
int newx = x[i] + xx;
int newy = y[i] + yy;
if ( newx >= 0 && newy >= 0 && newx < n && newy < m&& kk - 1 > bool[newx][newy]) {
dfs(newx, newy, kk - 1);
}
}
}
}