规则是按围棋规则来的,需要干两件事:1找气 2找敌人(需要validate敌人, 如果敌人外面一圈被包了,敌人是无效的)。跑过了几个testcases,欢迎讨论。
- public class Chess {
- class ResultType {
- boolean foundAir, foundEnemy;
- public ResultType(boolean foundAir, boolean foundEnemy) {
- this.foundAir = foundAir;
- this.foundEnemy = foundEnemy;
- }
- }
- int[] dx = {1, 0, 0, -1};
- int[] dy = {0, 1, -1, 0};
- // 1 black, 0 while, 2 air
- public boolean isAlive(int[][] board, int i, int j) {
- // validate given location, outOfBoard || foundAir
- if (!inbound(board, i, j) || board[i][j] == 2) return false;
- int val = board[i][j];
- ResultType ans = findEmptyNeighbor(board, i, j, val);
- return ans.foundAir || !ans.foundEnemy;
- }
- private ResultType findEmptyNeighbor(int[][] board, int x, int y, int val) {
- boolean foundAir = false;
- boolean foundEnemy = false;
- // found air
- if (board[x][y] == 2) return new ResultType(true, foundEnemy);
- // found enemy
- if (board[x][y] == 1 - val) {
- // validate enemy
- board[x][y] = Integer.MAX_VALUE;
- boolean enemyFoundEnemy = false;
- for (int k = 0; k < dx.length; k++) {
- int xx = x + dx[k];
- int yy = y + dy[k];
- if (!inbound(board, xx, yy) || board[xx][yy] == Integer.MAX_VALUE) continue;
- ResultType enemyChild = findEmptyNeighbor(board, xx, yy, 1 - val);
- foundEnemy |= enemyChild.foundAir;
- enemyFoundEnemy |= enemyChild.foundEnemy;
- }
- // two enemy valid conditions: 1. enemy find Air 2. enemy find no its enemy
- foundEnemy |= !enemyFoundEnemy;
- return new ResultType(foundAir, foundEnemy);
- //return false;
- }
- // found its kind
- board[x][y] = Integer.MAX_VALUE;
- for (int k = 0; k < dx.length; k++) {
- int xx = x + dx[k];
- int yy = y + dy[k];
- if (!inbound(board, xx, yy) || board[xx][yy] == Integer.MAX_VALUE) continue;
- ResultType child = findEmptyNeighbor(board, xx, yy, val);
- foundAir |= child.foundAir;
- foundEnemy |= child.foundEnemy;
- }
- return new ResultType(foundAir, foundEnemy);
- }
- private boolean inbound(int[][] board, int i, int j) {
- return i >= 0 && i < board.length && j >= 0 && j < board[0].length;
- }
- }
- class Main{
- public static void main(String[] args) {
- int[][] board = {{1,1,1,1},
- {1,1,1,1},
- {1,1,0,1},
- {1,1,1,1}};
- int[][] board1 = {{1,1,1,1},
- {1,1,1,1},
- {1,2,0,1},
- {1,1,1,1}};
- int[][] board2 = {{0,0,0,0,0},
- {0,1,1,1,0},
- {0,1,0,1,0},
- {0,1,1,1,0},
- {0,0,0,0,0}};
- int[][] board3 = {{1,1,1,1,1,1,1},
- {1,0,0,0,0,0,1},
- {1,0,1,1,1,0,1},
- {1,0,1,0,1,0,1},
- {1,0,1,1,1,0,1},
- {1,0,0,0,0,0,1},
- {1,1,1,1,1,1,1}};
- Chess test = new Chess();
- System.out.println(test.isAlive(board, 2,2)? "Alive": "Dead");
- System.out.println(test.isAlive(board1, 2,2)? "Alive": "Dead");
- System.out.println(test.isAlive(board2, 2,2)? "Alive": "Dead");
- System.out.println(test.isAlive(board3, 2,2)? "Alive": "Dead");
- }
- }
复制代码
|