在一个地图中
(
地图由
n*n
个区域组成),有部分区域被感染病菌。感染区域每天都会把周
围(上下左右)的
4
个区域感染。
请根据给定的地图计算,多少天以后,全部区域都会被感染。
如果初始地图上所有区域全部都被感染,或者没有被感染区域,返回
-1
输入描述:
一行
N*N
个数字(只包含
0,1
,不会有其他数字)表示一个地图,数字间用
,
分割,
0
表示未
感染区域,
1
表示已经感染区域
每
N
个数字表示地图中一行,输入数据共表示
N
行
N
列的区域地图。
例如输入
1,0,1,0,0,0,1,0,1
,表示地图
1,0,1
0,0,0
1,0,1
输出描述:
一个整数,表示经过多少天以后,全部区域都被感染
补充说明:
1<=N<200
public class KSTime {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String str = in.nextLine();
//如果全0或者全1,则退出
if (!str.contains("1")||!str.contains("0")){
System.out.println(-1);
System.exit(0);
}
String[] strings=str.split(",");
int n=(int)Math.sqrt(strings.length);
int index=0;
int[][] attr=new int[n][n];
for (int i=0;i<n;i++)
for (int j=0;j<n;j++){
attr[i][j]=Integer.parseInt(strings[index]);
index++;
}
int day = getDay(attr,n);
System.out.println(day);
}
/**
* 获取感染天数
*/
public static int getDay(int[][] attr,int n){
int day=0;
int check = check(attr, n);
while (check(attr,n)!=1) {
attr = stack(attr, n);
day++;
}
return day;
}
/**
* 判断是否全部感染
*/
public static int check(int[][] attr,int n){
for (int i=0;i<n;i++)
for (int j=0;j<n;j++){
if (attr[i][j]==0){
return 0;
}
}
return 1;
}
/**
* 进行感染
*/
public static int[][] stack(int[][] attr,int n){
int[][] temp=new int[n][n];
//记录临时数组
for (int i=0;i<n;i++)
for (int j=0;j<n;j++){
temp[i][j]=attr[i][j];
}
for (int i=0;i<n;i++)
for (int j=0;j<n;j++){
if (attr[i][j]==1){
//上
if (i-1>=0){
temp[i-1][j]=1;
}
//下
if (i+1<n){
temp[i+1][j]=1;
}
//左
if (j-1>0){
temp[i][j-1]=1;
}
//右
if (j+1<n){
temp[i][j+1]=1;
}
}
}
return temp;
}
}