12
返回列表 发新帖
楼主: 14417335
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 围棋

🔗
 楼主| 14417335 2019-3-12 09:55:11 | 只看该作者
全局:
adh360 发表于 2019-3-12 09:48
这个题如果较真,感觉是个无底洞,估计可以几个小时不写代码,光讨论各种情况就时间用完了(什么棋的死活, ...

完全同意。面试官也不可能让我们blah下去。一定会先要求把最简单的有气无气做出来。
回复

使用道具 举报

无效楼层,该帖已经被删除
🔗
zlfp 2019-3-12 10:04:41 | 只看该作者
全局:
我发了最简单做法的代码,不知道为什么审核总是不通过

补充内容 (2019-3-12 11:52):
啊现在通过了
回复

使用道具 举报

🔗
徐晃班长 2019-3-12 22:40:57 | 只看该作者
全局:
规则是按围棋规则来的,需要干两件事:1找气 2找敌人(需要validate敌人, 如果敌人外面一圈被包了,敌人是无效的)。跑过了几个testcases,欢迎讨论。
  1. public class Chess {
  2.     class ResultType {
  3.         boolean foundAir, foundEnemy;
  4.         public ResultType(boolean foundAir, boolean foundEnemy) {
  5.             this.foundAir = foundAir;
  6.             this.foundEnemy = foundEnemy;
  7.         }
  8.     }
  9.     int[] dx = {1, 0, 0, -1};
  10.     int[] dy = {0, 1, -1, 0};
  11.     // 1 black, 0 while, 2 air
  12.     public boolean isAlive(int[][] board, int i, int j) {
  13.         // validate given location, outOfBoard || foundAir
  14.         if (!inbound(board, i, j) || board[i][j] == 2) return false;
  15.         int val = board[i][j];
  16.         ResultType ans = findEmptyNeighbor(board, i, j, val);
  17.         return ans.foundAir || !ans.foundEnemy;
  18.     }
  19.     private ResultType findEmptyNeighbor(int[][] board, int x, int y, int val) {
  20.         boolean foundAir = false;
  21.         boolean foundEnemy = false;
  22.         // found air
  23.         if (board[x][y] == 2) return new ResultType(true, foundEnemy);
  24.         // found enemy
  25.         if (board[x][y] == 1 - val) {
  26.             // validate enemy
  27.             board[x][y] = Integer.MAX_VALUE;
  28.             boolean enemyFoundEnemy = false;
  29.             for (int k = 0; k < dx.length; k++) {
  30.                 int xx = x + dx[k];
  31.                 int yy = y + dy[k];
  32.                 if (!inbound(board, xx, yy) || board[xx][yy] == Integer.MAX_VALUE) continue;
  33.                 ResultType enemyChild = findEmptyNeighbor(board, xx, yy, 1 - val);
  34.                 foundEnemy |= enemyChild.foundAir;
  35.                 enemyFoundEnemy |= enemyChild.foundEnemy;
  36.             }
  37.             // two enemy valid conditions: 1. enemy find Air 2. enemy find no its enemy
  38.             foundEnemy |= !enemyFoundEnemy;

  39.             return new ResultType(foundAir, foundEnemy);
  40.             //return false;
  41.         }
  42.         // found its kind
  43.         board[x][y] = Integer.MAX_VALUE;
  44.         for (int k = 0; k < dx.length; k++) {
  45.             int xx = x + dx[k];
  46.             int yy = y + dy[k];
  47.             if (!inbound(board, xx, yy) || board[xx][yy] == Integer.MAX_VALUE) continue;
  48.             ResultType child = findEmptyNeighbor(board, xx, yy, val);
  49.             foundAir |= child.foundAir;
  50.             foundEnemy |= child.foundEnemy;
  51.         }
  52.         return new ResultType(foundAir, foundEnemy);
  53.     }
  54.     private boolean inbound(int[][] board, int i, int j) {
  55.         return i >= 0 && i < board.length && j >= 0 && j < board[0].length;
  56.     }
  57. }

  58. class Main{
  59.     public static void main(String[] args) {
  60.         int[][] board = {{1,1,1,1},
  61.                          {1,1,1,1},
  62.                          {1,1,0,1},
  63.                          {1,1,1,1}};
  64.         int[][] board1 = {{1,1,1,1},
  65.                           {1,1,1,1},
  66.                           {1,2,0,1},
  67.                           {1,1,1,1}};
  68.         int[][] board2 = {{0,0,0,0,0},
  69.                           {0,1,1,1,0},
  70.                           {0,1,0,1,0},
  71.                           {0,1,1,1,0},
  72.                           {0,0,0,0,0}};
  73.         int[][] board3 = {{1,1,1,1,1,1,1},
  74.                           {1,0,0,0,0,0,1},
  75.                           {1,0,1,1,1,0,1},
  76.                           {1,0,1,0,1,0,1},
  77.                           {1,0,1,1,1,0,1},
  78.                           {1,0,0,0,0,0,1},
  79.                           {1,1,1,1,1,1,1}};
  80.         Chess test = new Chess();
  81.         System.out.println(test.isAlive(board, 2,2)? "Alive": "Dead");
  82.         System.out.println(test.isAlive(board1, 2,2)? "Alive": "Dead");
  83.         System.out.println(test.isAlive(board2, 2,2)? "Alive": "Dead");
  84.         System.out.println(test.isAlive(board3, 2,2)? "Alive": "Dead");
  85.     }
  86. }
复制代码

评分

参与人数 3大米 +21 收起 理由
starzero + 1 给你点个赞!
admin + 10
14417335 + 10 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
chenyijia055 2019-5-22 11:42:28 | 只看该作者
全局:
zlfp 发表于 2019-3-12 08:49
如果是按照围棋规则中被“围死”完全没有气的那种被称作“包围”的话,用简单的BFS即可,我这里简单写了一 ...

请教一个问题,如果我们只考虑四个格子的棋盘,四个格子全被占满, 左上左下是白色,只有右上右下是黑色。我能说任意一个棋子都是被包围的吗??从你的code来看好像是这样,因为不会return false, 但是我感觉上怪怪的,不太懂围棋规则。
回复

使用道具 举报

🔗
zlfp 2019-5-22 14:18:47 | 只看该作者
全局:
chenyijia055 发表于 2019-5-22 11:42
请教一个问题,如果我们只考虑四个格子的棋盘,四个格子全被占满, 左上左下是白色,只有右上右下是黑色 ...

有道理。因为现实生活中不会有这种情况,我就忽视了
面试的时候需要跟面试官讨论,纳入或者排除这种情况。
回复

使用道具 举报

🔗
djmiss 2019-5-23 04:53:09 | 只看该作者
全局:
很多中国人都不懂围棋规则,老外懂得就更少了。。。而懂规则的又会想到更多的情况, 比如打劫,双活,假眼。
这题需要把意图明确的说清楚。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表