我正在制作一个用地形表示来读取栅栏的程序。现在,代码查看数组,并报告需要多少栅栏,每边1 2.5米。问题是我不知道这些数字出了什么问题。它很好地显示角值,但是边值是不正确的,除了最后一列显示正确的值,但这可能只是巧合。我有i's和j's来表示x和y值,到目前为止,这是我所有的代码。
package assignment_2;
public class Fencing {
public static void main(String[] args) {
boolean b = true;
double corner = 0;
double core = 0;
double side = 0;
int i = 0;
int j = 0;
int[][] map = {
{ 0, 1, 1, 0 },
{ 1, 1, 1, 1 },
{ 1, 1, 1, 1 },
{ 1, 1, 0, 1 }
};
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (map[i][j] != 1 && map[i][j] != 0) {
b = false;
System.out.println("--> A value of " + map[i][j] + " was found at " + i + "," + j);
}
}
}
if (b == false && i == 4) {
System.out.println("The map is invalid");
return;
} else {
System.out.println("Map is valid");
}
if (map[0][0] == 1) {
corner += 5;
if (map[1][0] == 1 && map[0][1] == 1) {
corner += 0;
}
if (map[1][0] != 1 && map[0][1] != 1) {
corner += 5;
}
if (map[1][0] != 1 && map[0][1] == 1 || map[1][0] == 1 && map[0][1] != 1) {
corner += 2.5;
}
} else {
corner += 0;
}
if (map[0][3] == 1) {
corner += 5;
if (map[1][3] == 1 && map[0][2] == 1) {
corner += 0;
}
if (map[1][3] != 1 && map[0][2] != 1) {
corner += 5;
}
if (map[1][3] != 1 && map[0][2] == 1 || map[1][3] == 1 && map[0][2] != 1) {
corner += 2.5;
}
} else {
corner += 0;
}
if (map[3][0] == 1) {
corner += 5;
if (map[3][1] == 1 && map[2][0] == 1) {
corner += 0;
}
if (map[3][1] != 1 && map[02][0] != 1) {
corner += 5;
}
if (map[3][1] != 1 && map[2][0] == 1 || map[3][1] == 1 && map[2][0] != 1) {
corner += 2.5;
}
} else {
corner += 0;
}
if (map[3][3] == 1) {
corner += 5;
if (map[3][2] == 1 && map[2][3] == 1) {
corner += 0;
}
if (map[3][2] != 1 && map[2][3] != 1) {
corner += 5;
}
if (map[3][2] != 1 && map[2][3] == 1 || map[3][2] == 1 && map[2][3] != 1) {
corner += 2.5;
}
} else {
corner += 0;
}
System.out.println("Corner fencing = " + corner);
for (i = 1; i > 2; i++) { // Top
if (map[0][j] == 1) {
side += 2.5;
if (map[i + 1][0] == 1 && map[i - 1][0] == 1) {
side += 0;
}
if (map[i + 1][0] != 1 || map[i - 1][0] != 1) {
side += 2.5;
}
if (map[i + 1][0] != 1 && map[i - 1][0] != 1) {
side += 5;
}
} else {
side += 0;
}
}
System.out.println("After the first row, fencing = " + side);
for (i = 1; i > 2; i++) { // Bottom
if (map[i][3] == 1) {
side += 2.5;
if (map[i + 1][3] == 1 && map[i - 1][3] == 1) {
side += 0;
}
if (map[i + 1][3] != 1 || map[i - 1][3] != 1) {
side += 2.5;
}
if (map[i + 1][3] != 1 && map[i - 1][3] != 1) {
side += 5;
}
} else {
side += 0;
}
}
System.out.println("After the bottom row, fencing = " + side);
for (j = 1; j < 3; j++) {// Right
if (map[3][j] == 1) {
side += 2.5;
if (map[3][j + 1] == 1 && map[3][j - 1] == 1) {
side += 0;
}
if (map[3][j + 1] != 1 || map[3][j - 1] != 1) {
side += 2.5;
}
if (map[3][j + 1] != 1 && map[3][j - 1] != 1) {
side += 5;
}
} else {
side += 0;
}
}
System.out.println("After the first column, fencing = " + side);
for (j = 1; j < 3; j++) {// Left
if (map[0][j] == 1) {
side += 2.5;
if (map[0][j + 1] == 1 && map[0][j - 1] == 1) {
side += 0;
}
if (map[0][j + 1] != 1 || map[0][j - 1] != 1) {
side += 2.5;
}
if (map[0][j + 1] != 1 && map[0][j - 1] != 1) {
side += 5;
}
} else {
side += 0;
}
}
System.out.println("After the last column, fencing = " + side);
}
}弯角工作正常,但问题是边角( for循环)。边沿穿过数组的当前行,如果数字为1,则检查它们旁边的数字,如果为0,则添加2.5m。这个问题似乎与i和j使值不正确有关,但我不太确定它们有什么问题。有人能帮我吗?
以下是当前的输出:
Corner fencing = 12.5
After the first row, fencing = 0.0
After the bottom row, fencing = 0.0
After the first column, fencing = 5.0
After the last column, fencing = 15.0这是预期的产出:
Corner fencing = 12.5
After the first row, fencing = 5.0
After the bottom row, fencing = 10.0
After the first column, fencing = 15.0
After the last column, fencing = 20.0发布于 2016-11-08 20:00:05
我不完全理解代码中的栅栏是什么,或者边角代表什么,但我将指出您的代码存在的几个问题,以及可能出错的地方。
1-共享局部变量:
int i,j;在多个块之间共享,因此在一个块中更改这些块肯定会影响它们在另一个块中的状态。
Sol:如果vars要具有相同的名称,则->使用命名块
2-错误条件:代码中有两个错误的条件-bottom和top for循环-
(i = 1; i > 2; i++)这里是修改后的代码:
public class Fencing {
public static void main(String[] args) {
boolean b = true;
double corner = 0;
double core = 0;
double side = 0;
int[][] map = {
{ 0, 1, 1, 0 },
{ 1, 1, 1, 1 },
{ 1, 1, 1, 1 },
{ 1, 1, 0, 1 }
};
firstBlock:{
int i = 0;
int j = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (map[i][j] != 1 && map[i][j] != 0) {
b = false;
System.out.println("--> A value of " + map[i][j] + " was found at " + i + "," + j);
}
}
}
if (b == false && i == 4) {
System.out.println("The map is invalid");
return;
} else {
System.out.println("Map is valid");
}
if (map[0][0] == 1) {
corner += 5;
if (map[1][0] == 1 && map[0][1] == 1) {
corner += 0;
}
if (map[1][0] != 1 && map[0][1] != 1) {
corner += 5;
}
if (map[1][0] != 1 && map[0][1] == 1 || map[1][0] == 1 && map[0][1] != 1) {
corner += 2.5;
}
} else {
corner += 0;
}
if (map[0][3] == 1) {
corner += 5;
if (map[1][3] == 1 && map[0][2] == 1) {
corner += 0;
}
if (map[1][3] != 1 && map[0][2] != 1) {
corner += 5;
}
if (map[1][3] != 1 && map[0][2] == 1 || map[1][3] == 1 && map[0][2] != 1) {
corner += 2.5;
}
} else {
corner += 0;
}
if (map[3][0] == 1) {
corner += 5;
if (map[3][1] == 1 && map[2][0] == 1) {
corner += 0;
}
if (map[3][1] != 1 && map[02][0] != 1) {
corner += 5;
}
if (map[3][1] != 1 && map[2][0] == 1 || map[3][1] == 1 && map[2][0] != 1) {
corner += 2.5;
}
} else {
corner += 0;
}
if (map[3][3] == 1) {
corner += 5;
if (map[3][2] == 1 && map[2][3] == 1) {
corner += 0;
}
if (map[3][2] != 1 && map[2][3] != 1) {
corner += 5;
}
if (map[3][2] != 1 && map[2][3] == 1 || map[3][2] == 1 && map[2][3] != 1) {
corner += 2.5;
}
} else {
corner += 0;
}
System.out.println("Corner fencing = " + corner);
}
secondBlock:{
int i = 0;
int j = 0;
for (i = 1; i < 2; i++) { // Top
if (map[0][j] == 1) {
side += 2.5;
if (map[i + 1][0] == 1 && map[i - 1][0] == 1) {
side += 0;
}
if (map[i + 1][0] != 1 || map[i - 1][0] != 1) {
side += 2.5;
}
if (map[i + 1][0] != 1 && map[i - 1][0] != 1) {
side += 5;
}
} else {
side += 0;
}
}
System.out.println("After the first row, fencing = " + side);}
thirdBlock:{
int i = 0;
int j = 0;
for (i = 1; i < 2; i++) { // Bottom
if (map[i][3] == 1) {
side += 2.5;
if (map[i + 1][3] == 1 && map[i - 1][3] == 1) {
side += 0;
}
if (map[i + 1][3] != 1 || map[i - 1][3] != 1) {
side += 2.5;
}
if (map[i + 1][3] != 1 && map[i - 1][3] != 1) {
side += 5;
}
} else {
side += 0;
}
}
System.out.println("After the bottom row, fencing = " + side);}
fourthBlock:{
int i = 0;
int j = 0;
for (j = 1; j < 3; j++) {// Right
if (map[3][j] == 1) {
side += 2.5;
if (map[3][j + 1] == 1 && map[3][j - 1] == 1) {
side += 0;
}
if (map[3][j + 1] != 1 || map[3][j - 1] != 1) {
side += 2.5;
}
if (map[3][j + 1] != 1 && map[3][j - 1] != 1) {
side += 5;
}
} else {
side += 0;
}
}
System.out.println("After the first column, fencing = " + side);}
lastBlock:{
int i = 0;
int j = 0;
for (j = 1; j < 3; j++) {// Left
if (map[0][j] == 1) {
side += 2.5;
if (map[0][j + 1] == 1 && map[0][j - 1] == 1) {
side += 0;
}
if (map[0][j + 1] != 1 || map[0][j - 1] != 1) {
side += 2.5;
}
if (map[0][j + 1] != 1 && map[0][j - 1] != 1) {
side += 5;
}
} else {
side += 0;
}
}
System.out.println("After the last column, fencing = " + side);}
}
}产出如下:
Map is valid
Corner fencing = 12.5
After the first row, fencing = 0.0
After the bottom row, fencing = 5.0
After the first column, fencing = 10.0
After the last column, fencing = 20.0我必须指出,first row fencing is equal to 0.0而不是5,这是因为(map[i + 1][0] != 1 && map[i - 1][0] != 1),所以您必须相应地改变这一点。
发布于 2016-11-08 20:44:28
我将假设您想要计算每个元素的所有外部面,即数组中的1,每个面构成一个重为2.5m的栅栏。
这并不是说它很漂亮,但它基本上应该能做你想做的事情:
public class Fencing {
public static void main(String[] args) {
double totalFencingUnits = 0;
double fencingUnitWeight = 2.5;
boolean b = true;
double corner = 0;
double core = 0;
double side = 0;
int i = 0;
int j = 0;
int[][] map = {
{ 0, 1, 1, 0 },
{ 1, 1, 1, 1 },
{ 1, 1, 1, 1 },
{ 1, 1, 0, 1 }
};
for (i = 0; i < map.length; i++) {
for (j = 0; j < map[0].length; j++) {
if (map[i][j] != 1 && map[i][j] != 0) {
b = false;
System.out.println("--> An invalid value of " + map[i][j] + " was found at " + i + "," + j);
}
if ( map[i][j] == 1){
//do the outer corners
if((i == 0 && (j == 0 || j == map.length - 1)) || (i == map.length - 1 && (j == 0 || j == map.length - 1))){
System.out.println("A corner " + map[i][j] + " was found at " + i + "," + j);
totalFencingUnits += 2;
switch (2*i - j ) {
case -3:
totalFencingUnits += map[i][j - 1] > 0?0:1;
totalFencingUnits += map[i + 1][j] > 0?0:1;
break;
case 6:
totalFencingUnits += map[i - 1][j] > 0?0:1;
totalFencingUnits += map[i ][j + 1] > 0?0:1;
break;
case 0:
totalFencingUnits += map[i][j + 1] > 0?0:1;
totalFencingUnits += map[i +1 ][j] > 0?0:1;
break;
case 3:
totalFencingUnits += map[i - 1][j] > 0?0:1;
totalFencingUnits += map[i ][j - 1] > 0?0:1;
break;
default:
break;
}
}
//do the outer sides
else if((i == 0 && (j != 0 && j != map.length - 1)) || (i == map.length - 1 && (j != 0 && j != map.length - 1))
|| (j == 0 && (i != 0 && i != map.length - 1)) || (j == map.length - 1 && (i != 0 && i != map.length - 1))){
System.out.println("A side " + map[i][j] + " was found at " + i + "," + j);
totalFencingUnits ++;
if ( i == 0){
totalFencingUnits += map[i][j - 1] > 0?0:1;
totalFencingUnits += map[i + 1][j] > 0?0:1;
totalFencingUnits += map[i][j + 1] > 0?0:1;
}
if (i == map.length - 1){
totalFencingUnits += map[i][j - 1] > 0?0:1;
totalFencingUnits += map[i -1 ][j] > 0?0:1;
totalFencingUnits += map[i][j + 1] > 0?0:1;
}
if ( j == 0){
totalFencingUnits += map[i - 1][j] > 0?0:1;
totalFencingUnits += map[i][j + 1] > 0?0:1;
totalFencingUnits += map[i + 1][j ] > 0?0:1;
}
if ( j == map.length - 1){
totalFencingUnits += map[i - 1][j] > 0?0:1;
totalFencingUnits += map[i][j - 1] > 0?0:1;
totalFencingUnits += map[i + 1][j ] > 0?0:1;
}
}
//now do the internals blocks
else {
System.out.println("An internal " + map[i][j] + " was found at " + i + "," + j);
totalFencingUnits += map[i - 1][j] > 0?0:1;
totalFencingUnits += map[i][j - 1] > 0?0:1;
totalFencingUnits += map[i ][j + 1] > 0?0:1;
totalFencingUnits += map[i + 1][j ] > 0?0:1;
}
}
}
}
if (b == false && i == 4) {
System.out.println("The map is invalid");
return;
} else {
System.out.println("Map is valid");
System.out.println("TOTAL FENCING UNITS: " + totalFencingUnits );
System.out.println("TOTAL FENCING WEIGHT: " + totalFencingUnits * fencingUnitWeight);
}
}
}我在编译做了这个
得到了这个输出:
地图有效
在0,1处发现侧1
在0,2处发现侧1
在1,0处发现侧1
在1,1处发现一个内部1
在1,2处发现一个内部1
在1,3处发现了侧1
在2,0发现了一侧1
在2,1发现了一个内部1
在2,2处发现了一个内部1
发现侧1在2,3处
在3,0发现了一个拐角处
发现侧1在3,1
在3,3处发现了一个拐角处
击剑单位总数: 18.0
击剑总重量: 45.0
而且,看起来我的输入的输出实际上应该是45 (即。18张脸)。你应该也考虑一下外面的边缘吗?
https://stackoverflow.com/questions/40494695
复制相似问题