1.题目描述:记不清了,大致是产品经理用1表示,程序员用2,0表示空。对于一个二维数组,每分钟程序员可以将上下左右的产品经理变为程序员,就是将1变为2;对于0不做变化。输出为将所有产品经理变为程序员需要几分钟;如果最后结果还有产品经理无法改变状态,输出-1
2.输入:
1 2 1
1 1 0
0 1 1
输出:
3
note:
1 2 1 2 2 2 2 2 2 2 2 2
1 1 0 1 2 0 2 2 0 2 2 0
0 1 1 0 1 1 0 2 1 0 2 2
3.算法:简单的模拟过程,说是可以用BFS,还没尝试。发现大家很容易卡在输入输出,我本来输入处理:
While(true){ if(tmp.equals("")) break; }
一直显示数组越界,后来改成sc.hasNext()才通过。本机运行,使用ctrl+d中止输入。
package example.Tiktok;
import java.util.Scanner;
public class A1 {
//程序员改变产品经理的过程
public static boolean change(int[][] data,int i,int j){
int cnt = 0;//记录change过程的操作数
if(i>0){
if(data[i-1][j] == 1){
data[i-1][j] = 3;//变为3的原因是:如果变为2,在本轮循环就会处理这些2,这肯定是不对的
cnt++;
}
}
if(j>0){
if(data[i][j-1] == 1){
data[i][j-1] =3;
cnt++;
}
}
if(j>=0 && j<data[0].length-1) {
if (data[i][j + 1] == 1){
data[i][j+1] = 3;
cnt++;
}
}
if(i>=0 && i<data.length-1 ){
if(data[i+1][j] == 1){
data[i+1][j] =3;
cnt++;
}
}
if(cnt > 0)
return true;
else
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int rows = 0;
String s = "";
//输入
while (sc.hasNext()){
String tmp = sc.nextLine();
rows++;
s = s + ","+tmp;
}
int time = 0;//最后结果:第几分钟完成了所有的可变产品经理变成程序员
String[] str = s.substring(1,s.length()).split(",");
for(int i=0;i<str.length;i++){
str[i] = str[i].replace(" ","");
}
int cols = str[0].length();
int[][] data = new int[rows][cols];
for(int i=0;i<str.length;i++){
for(int j=0;j<str[i].length();j++){
data[i][j] = str[i].charAt(j)-'0';
}
}
while (true){
boolean flag = false;//每一轮变化change过程是否有具体改变状态
int cnt = 0;//记录每轮变化后1的个数,要是为0,没必要进行下一轮
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(data[i][j] == 2){
if(change(data,i,j)){
flag = true;//有一个变动 就可以继续走下去
}
}
}
}
for(int i=0;i<rows;i++) {
for (int j = 0; j < cols; j++) {
if(data[i][j] == 3){
data[i][j] =2;//把原来的3再改回2
}
if(data[i][j] == 1)
cnt++;
}
}
time++;
//一轮结束
if(flag == false){
time = -1;
break;
}
if(cnt == 0){
//一轮结束没有1
break;
}
}
System.out.println(time);
}
}