我已经创建了一个12x12网格,在这个网格中,我创建了一个感染的网格#39;瓷砖,当一个被感染的瓷砖被其他被感染的瓷砖包围时,被包围的细胞变成患病的瓷砖。我想知道是否有一种很好的方法来检查相邻的,在边界单元格中的值?
public static void diseaseTiles() {
int i, j;
for(i = 0; i < 12; i++) {
for(j = 0; j < 12; j++) {
if(myGrid[i][j] == 'I'){
int left, right, up, down;
if(i == 0) {
left = 1;
}
if(i == 11) {
right = 1;
}
if(j == 0) {
up = 1;
}
if(j == 11) {
down = 1;
}
//this is where I've gotten stuck
//I was going to use the above int's to determine
//whether or not the adjacent tile in that direction
//should be checked (they're the border of the grid)
}
}
}
}
答案 0 :(得分:4)
您可以通过利用短路评估来检查细胞是否被感染:
boolean leftInfected = (i!=0) && myGrid[i-1][j]=='I';
boolean rightInfected = (i!=11) && myGrid[i+1][j]=='I';
boolean topInfected = (j!=0) && myGrid[i][j-1]=='I';
boolean bottomInfected = (j!=11) && myGrid[i][j+1]=='I';
之后,您可以检查是否所有四个都被感染了:
if (leftInfected && rightInfected && topInfected && bottomInfected) {
myGrid[i][j] = 'D';
}
答案 1 :(得分:2)
您可以考虑使用每个边缘周围一个单元格的边界填充数组,因此12x12
将成为14x14
。使边界中的每个细胞都被感染。然后,您可以循环遍历内部单元格(即行1:12,cols 1:12),而无需一直检查单元格是否处于边缘。
答案 2 :(得分:1)
我认为更好的选择是定义一个辅助数组来定义有效的邻居并使用它进行迭代。我的方法的优点是它可以很容易地改变哪些是有效的邻居(比如你想让8个邻居允许通过对角线而不是4个):
int moves[][] = {{-1,0}, {0, -1}, {1, 0}, {0, 1} };
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
for (int l = 0; l < 4 /* moves.length */; ++l) {
int ti = i + move[l][0];
int tj = j + move[l][1];
if (ti <= 0 || ti >= 12 || tj < 0 || tj >= 12) {
continue;
}
// cell (ti, tj) is valid neighbor do something with it.
}
}
}