最近,我遇到了一个有趣的编程难题,该难题中提到了一些很好的曲折。在令我惊讶的问题之下,我只是渴望知道在下面的情况下在Java中是否可能有任何相关的解决方案。

问题陈述:
有一个尺寸为m * n的网格,最初,在该网格的左下角单元格(m-1,0)中存在细菌,其他所有单元格均为空。每秒之后,网格中的每种细菌会自我分裂,并使相邻(水平,垂直和对角线)细胞中的细菌数增加1并死亡。

在n-1秒后,右下角的单元格(m-1,n-1)中存在多少细菌?
我从
https://www.codechef.com/problems/BGH17
但未能提交解决方案
以下是更多问题现场的图片

java - 编程难题:如何计算存活细菌的数量?-LMLPHP

最佳答案

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class BacteriaProblem {
      public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Number of Rows: ");
        int m = sc.nextInt();
        System.out.println("Number of Columns: ");
        int n = sc.nextInt();
        int[][] input = new int[m][n];
        input[m - 1][0] = 1;
        Stack<String> stack = new Stack<>();
        stack.push(m - 1 + "~" + 0);
        reproduce(stack, input, n - 1);

        System.out.println("Value at Bottom Right corner after n-1 secs: " + input[m - 1][n - 1]);
      }

      private static void reproduce(Stack<String> stack, int[][] input, int times) {
        //exit condition
        if (times < 1) {
          return;
        }

        //bacteria after splitting
        List<String> children = new ArrayList<>();

        //reproduce all existing bacteria
        while (!stack.isEmpty()) {
          String[] coordinates = stack.pop().split("~");
          int x = Integer.parseInt(coordinates[0]);
          int y = Integer.parseInt(coordinates[1]);


          for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
              if (i == 0 && j == 0) continue;
              split(input, x + i, y + j, children);
            }
          }
          input[x][y]--;
        }

        //add all children to stack
        for (String coord : children) {
          stack.push(coord);
        }

        //reduce times by 1
        reproduce(stack, input, times - 1);

      }

      private static void split(int[][] input, int x, int y, List<String> children) {
        int m = input.length;
        int n = input[0].length;

        if (x >= 0 && x < m && y >= 0 && y < n) {
          input[x][y]++;
          children.add(x + "~" + y);
        }
      }
    }

10-07 15:32