import java.util.Scanner;
public class Main {
static Scanner in = new Scanner(System.in);
static int width=0; // 宽度
static int height=0; // 高度
static int[][] field_old; // 旧的网格
static int[][] field_new; // 新的网格
static int times; // 步数
public static void main(String[] args) {
// 首先输入两个正整数,范围为[3,102],依次表示网格的宽度和高度。
width=in.nextInt();
height=in.nextInt();
// 初始化数组
initial();
// 然后,以一个正整数,范围为[1,10000],表示要求细胞自动机执行的步数。
times=in.nextInt();
// 细胞自动机执行
run(times);
System.out.println(count(field_old));// 输出一个正整数,表示执行完毕后,剩下的活着的细胞的数量。
}
// 初始化数组
public static void initial() {
field_old=new int[height][width];
field_new=new int[height][width];
for(int i=0; i<field_old.length; i++) {
for(int j=0; j<field_old[i].length; j++) {
field_old[i][j]=0;
field_new[i][j]=0;
}
}
// 然后输入多组正整数,依次表示一个活着的细胞的网格位置,每组数字中,第一个表示行号,第二个表示列号,均从0开始编号。
while (true) {
int i=in.nextInt();
int j=in.nextInt();
if (i==-1&&j==-1) {
break;// 最后,以“-1 -1”表示不再有活着的细胞。-1 -1不是有效的位置。
}
field_old[i][j] = 1;
field_new[i][j] = 1;
}
}
// 细胞自动机执行
public static void run(int times) {
int number;
for(int i=0; i<times; i++) {
for(int j=0; j<field_old.length; j++) {
for(int k=0; k<field_old[j].length; k++) {
number = getNeighbour(j, k);// 计算周围活着的细胞
if (field_old[j][k]==1 && (number==2||number==3)) {
field_new[j][k]=1;
} else {
field_new[j][k]=0;
}
if (field_old[j][k]==0&&number==3) {
field_new[j][k]=1;
}
}
}
for(int j=0; j<field_new.length; j++) {
for(int k=0; k<field_new[j].length; k++) {
field_old[j][k]=field_new[j][k];// 把新的复制到旧的
}
}
}
}
// 计算周围活着的细胞
public static int getNeighbour(int i, int j) {
int number;
if (i==0&&j==0) {// 左上角
number=field_old[i][j+1]+field_old[i+1][j+1]+field_old[i+1][j];
} else if (i==0&&j==width-1) {// 右上角
number = field_old[i][j-1] + field_old[i+1][j-1] + field_old[i+1][j];
} else if (i== height -1&&j==0) {// 左下角
number = field_old[i-1][j] + field_old[i-1][j+1] + field_old[i][j+1];
} else if (i== height -1 && j == width - 1) {// 右下角
number = field_old[i-1][j] + field_old[i-1][j-1] + field_old[i][j-1];
} else if (i== 0) {// 首行其他
number = field_old[i][j-1] + field_old[i+1][j-1] + field_old[i+1][j] + field_old[i+1][j+1]
+ field_old[i][j+1];
} else if (i== height - 1) {// 末行其他
number = field_old[i][j-1] + field_old[i-1][j-1] + field_old[i-1][j] + field_old[i-1][j+1]
+ field_old[i][j+1];
} else if (j== 0) {// 最左其他
number = field_old[i-1][j] + field_old[i-1][j+1] + field_old[i][j+1] + field_old[i+1][j+1]
+ field_old[i + 1][j];
} else if (j== width - 1) {// 最右其他
number = field_old[i-1][j] + field_old[i-1][j-1] + field_old[i][j-1] + field_old[i+1][j-1]
+ field_old[i+1][j];
} else {// 其他
number = field_old[i-1][j-1] + field_old[i-1][j] + field_old[i-1][j+1] + field_old[i][j+1]
+ field_old[i+1][j+1] + field_old[i+1][j] + field_old[i+1][j-1] + field_old[i][j-1];
}
return number;
}
// 剩下的活着的细胞的数量
public static int count(int[][] field) {
int number = 0;
for (int i = 0; i < field.length; i++) {
for (int j = 0; j < field[i].length; j++) {
if (field[i][j] == 1) {
number++;
}
}
}
return number;
}
}
具体哪一行提示的错误,这个是越界异常。
我试了下你的代码,你定义的前面的长度,后面去获取,不可以大于之前的数的,比如输入 4 ,3 ,1,2 就不会数组越界。
你输入 1,2,3,4就会越界,因为的长度是1与2 ,你确要取 3、4的下标的值,肯定报错
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632