Мне нужно написать программу для циклического перебора населения каждого города и заставить его потерять половину своего населения, если он примыкает (справа или слева) к городу с нулевым населением, пока во всех городах не останется людей.
Пример вывода:
Day 0 [3, 6, 0, 4, 3, 2, 7, 0]
Day 1 [3, 3, 0, 2, 3, 2, 3, 0]
Day 2 [3, 1, 0, 1, 3, 2, 1, 0]
Day 3 [3, 0, 0, 0, 3, 2, 0, 0]
Day 4 [1, 0, 0, 0, 1, 1, 0, 0]
Day 5 [0, 0, 0, 0, 0, 0, 0, 0]
---- EXTINCT ----
Вот что у меня есть на данный момент.
package PROJECT;
public class Main {
public static void main(String[] args) {
int[] day1 = {10, 6, 0, 4, 8, 10};
System.out.println(day1);
int[] day2 = {10, 3, 0, 2, 8, 10};
System.out.println(day2);
int[] day3 = {10, 1, 0, 1, 8, 10};
System.out.println(day3);
while(day1[2] == 0){
int day2[] = {10, 3, 0, 2, 4, 8, 10 };
if (day2[1] == 0){
int day3[] = {5, 1, 0, 1, 4, 8, 10};
} else if (day2[3]==0){
int day3[] = {10, 1, 0, 0, 2, 8, 10};
}
if (day3[1] == 0){
int day4[] = {5,0,0,0,1,8,10};
} else if (day3[3]==0){
int day4[] = {5, 0, 0, 0, 0, 4, 10};
}
if (day4[1] == 0){
int day5[] = {2,0,0,0,0,4,5};
} else if (day4[5]==0){
int day4[] = {2, 0, 0, 0, 0, 2, 10};
}
}
}
}
Мне нужно использовать одномерные массивы и цикл while / for.




Вот вам подход:
public class ApocalypseNow {
public static void main(String[] args) {
int[] population = { 10, 6, 0, 4, 8, 10 };
int currentValue;
int diminishedValue;
int dayCounters = 0;
while (!areAllDead(population)) {
for (int i = 0; i < population.length; i++) {
if (checkNeighbours(i, population)) {
currentValue = population[i];
diminishedValue = currentValue / 2;
population[i] = diminishedValue;
}
}
dayCounters++;
System.out.print("Day " + dayCounters + ": ");
printPopulation(population);
}
}
public static boolean checkNeighbours(int currentIndex, int[] population) {
int leftValue;
int rightValue;
try {
leftValue = population[currentIndex - 1];
} catch (ArrayIndexOutOfBoundsException e) {
leftValue = -1;
}
try {
rightValue = population[currentIndex + 1];
} catch (ArrayIndexOutOfBoundsException e) {
rightValue = -1;
}
if (leftValue == 0 || rightValue == 0)
return true;
return false;
}
public static void printPopulation(int[] population) {
for (int i : population) {
System.out.print(i + " ");
}
System.out.println();
}
public static boolean areAllDead(int[] population) {
for (int i = 0; i < population.length; i++) {
if (population[i] != 0)
return false;
}
return true;
}
}
Вывод:
Day 1: 10 3 0 2 8 10
Day 2: 10 1 0 1 8 10
Day 3: 10 0 0 0 4 10
Day 4: 5 0 0 0 2 10
Day 5: 2 0 0 0 1 10
Day 6: 1 0 0 0 0 5
Day 7: 0 0 0 0 0 2
Day 8: 0 0 0 0 0 1
Day 9: 0 0 0 0 0 0
почему вы создаете новый массив внутри вашего if / else? Они больше не будут существовать, как только вы покинете область видимости. Вам следует искать 2D-массивы или массив массивов, чтобы вы могли поддерживать свои массивы Day #. Затем зациклите свои массивы, проверяя каждую соседнюю ячейку на 0, проверяя границы и так далее, и если соседняя ячейка равна 0, разделите ваше число на 2 для каждого найденного соседнего 0.