トピック
【問題点】
シャオミンには空きスペースがあり、その空きスペースをn行m列に分割しています。各行と各列の長さは1です。
Xiao Mingはいくつかの小さな区画を選択し、草を植えましたが、他の区画は開いたままでした。
これらの草は非常に速く成長します。毎月、草は外側に成長します。小さな草を植えると、上下左右の4つの小さなスペースに拡大します。これらの4つの小さなスペースすべてが草で小片になります。
オープングラウンドの草がkヶ月でどこにあるかをシャオミンに教えてください。
【入力形式】入力
の1行目に2つの整数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です。
間違いを犯す
範囲外のインデックス
解決
インデックスの範囲外の例外を防ぐために、arr [n] [m]をarr [n + 2] [m + 2]に変更し、「0」に初期化することができます。
難しさ
周囲の広場に草の価値を正しく割り当てる方法
大きな問題の解決策
最初に芝生の近くのオープンスペースを「1」としてマークし、次にすべてのマークの後に「1」を「g」に変更します。
より詳細な説明はコードコメントにあります。
コード
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//种草
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
char arr[][]=new char[n+2][m+2];//防止索引越界异常
for(int i=0;i<n+2;i++){
for(int j=0;j<m+2;j++){
arr[i][j]='0'; //初始化为'0'
}
}
String str[] = new String[n];
for(int i=0;i<n;i++){
str[i]=scanner.next(); //将值以字符串的形式输入
}
for(int i=1;i<n+1;i++){
for(int j=1;j<m+1;j++){
arr[i][j]=str[i-1].charAt(j-1);//将字符串中的值赋给数组
}
}
int k = scanner.nextInt();
for(int l=0;l<k;l++){
for(int i=1;i<n+1;i++){
for(int j=1;j<m+1;j++){
if(arr[i][j]=='g'){
//将有草周边且非0的空地标为1
if(arr[i][j+1]!='0'&&arr[i][j+1]!='g'){
arr[i][j+1]='1';
}
if(arr[i][j-1]!='0'&&arr[i][j-1]!='g'){
arr[i][j-1]='1';
}
if(arr[i+1][j]!='0'&&arr[i+1][j]!='g'){
arr[i+1][j]='1';
}
if(arr[i-1][j]!='0'&&arr[i-1][j]!='g'){
arr[i-1][j]='1';
}
}
}
}
for(int i=1;i<n+1;i++){
//将空地变为有草地
for(int j=1;j<m+1;j++){
if(arr[i][j]=='1'){
arr[i][j]='g';
}
}
}
}
for(int i=1;i<n+1;i++){
//打印输出结果
for(int j=1;j<m+1;j++){
System.out.print(arr[i][j]);
}
System.out.println();
}
}
}