Google – Initialize Board
有一个类似于消方块的游戏,通过滑动交换items,行或者列凑过3个相同的item就消掉。要求是让初始化一个board,初始化之后要能使用户能够做出first move,意思是不能出现还没move就有三个相同的连在一起。
board是满的,不是空一格用来移动方块那种,是通过交换上下左右四个方向的方块。
Backtracking, 有点像sudoku
http://www.1point3acres.com/bbs/thread-143308-1-1.html
Design a algorithm to initialize the board of Candy Crush Saga. With M x N board, Q types of candies. (Rules: no 3 for run after initialization, must contain at least one valid move at the beginning)
先把Candy简化成数字,类型数组就成了[0, 1, 2, ..., Q-1]。规则一共三条:随机(至少玩家看上去是);不能一开始就有3个共线的;开局至少有一步能保证有消除(不然没法玩。。).鏈枃鍘熷垱鑷�1point3acres璁哄潧
鏉ユ簮涓€浜�.涓夊垎鍦拌鍧�.
1. 我首先关注的是前两条规则,因为觉得第三条只是小修改(尽管如果初始化完成后,再修改成符合第三条,可能导致连锁反应)。因为“随机”一直在我心头挥之不去,所以首先想到的是遍历所有格子,每次随机挑一个Q放进去,但立刻意识到这样很有可能导致死锁,尤其Q很小的时候,然后举了个死锁的例子。
2. 因为之前考虑过Q很小,所以最简单就是{0, 1}两种,立刻想到国际象棋棋盘:两色相间一定能填满而且无冲突。然后想到能不能先按照国际象棋棋盘填满,然后在这个基础上进行”随机化“。假如我有个遵循前两条规则的函数random(),对棋盘进行随机化。因为是在01棋盘改,所以第一遍下来可能还是很”假“,但既然这个函数是遵循前两条规则的,那么大可放心的多执行几遍。就像PS的滤镜叠加使用~ 然后开始讨论这个random()函数,大体思路是遍历棋盘,对每个格子有0.5 的概率进行”尝试修改“。(随机化就是一个慢慢tweak的过程,这个参数后面提到要根据实际效果调整)。尝试修改的算法就是:q = random(0, Q); 以q为中心向上下左右四个方向,一共有6条长度为3的线会造成潜在冲突,因此逐个检查一遍,假如无冲突就把当前位置替换为q。最后根据实际效果决定是否再来几次~
3. 然后就剩第三条规则:开局至少有一步能走。我上面阐述的时候就一直有个感觉,每局开始看似随机但一定有定势。然后让小哥打开手机游戏开了两局看了下,果然,每局开头一定会有{V型, _/型} 中的一种或两种排列,保证挪一步就能消除。跟小哥聊了这个想法之后,我的做法就是01棋盘生成后,随机选一个排列,比如V型,然后在棋盘上随机选一个(也可以多个)位置,把这个位置画出的V全部mark成不可修改。然后在这个基础上跑上面提到的random()算法。第三条规则也可以有很多随机性,必须类型选择,类型对应位置、个数的选择。
聊到这儿已经超时了。我问小哥这背后怎么实现的,他说他也不知道。。感觉这题很开放,不一定涉及多么高级的算法,几个随机参数的调整或许就能让开局看上去足够无规律了
Read full article from Google – Initialize Board
有一个类似于消方块的游戏,通过滑动交换items,行或者列凑过3个相同的item就消掉。要求是让初始化一个board,初始化之后要能使用户能够做出first move,意思是不能出现还没move就有三个相同的连在一起。
board是满的,不是空一格用来移动方块那种,是通过交换上下左右四个方向的方块。
Backtracking, 有点像sudoku
public int[][] initializeBoard(int m, int n) { int[][] board = new int[m][n]; int[] items = {1, 2, 3}; initialize(board, 0, 0, items); return board; } private boolean initialize(int[][] board, int i, int j, int[] items) { if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) { return true; } if (board[i][j] != 0) { return true; } for (int k = 0; k < 3; k++) { board[i][j] = items[k]; // choose random one to build random board boolean result = true; if (isValid(board, i, j)) { result &= initialize(board, i - 1, j, items); result &= initialize(board, i + 1, j, items); result &= initialize(board, i, j - 1, items); result &= initialize(board, i, j + 1, items); if (result == true) { return true; } } } return false; } private boolean isValid(int[][] board, int i, int j) { int curr = board[i][j]; if (i >= 2 && board[i - 2][j] == curr && board[i - 1][j] == curr) { return false; } if (i < board.length - 2 && board[i + 1][j] == curr && board[i + 2][j] == curr) { return false; } if (j >= 2 && board[i][j - 2] == curr && board[i][j - 1] == curr) { return false; } if (j < board[0].length - 2 && board[i][j + 1] == curr && board[i][j + 2] == curr) { return false; } return true; }http://www.1point3acres.com/bbs/thread-143308-1-1.html
Design a algorithm to initialize the board of Candy Crush Saga. With M x N board, Q types of candies. (Rules: no 3 for run after initialization, must contain at least one valid move at the beginning)
先把Candy简化成数字,类型数组就成了[0, 1, 2, ..., Q-1]。规则一共三条:随机(至少玩家看上去是);不能一开始就有3个共线的;开局至少有一步能保证有消除(不然没法玩。。).鏈枃鍘熷垱鑷�1point3acres璁哄潧
鏉ユ簮涓€浜�.涓夊垎鍦拌鍧�.
1. 我首先关注的是前两条规则,因为觉得第三条只是小修改(尽管如果初始化完成后,再修改成符合第三条,可能导致连锁反应)。因为“随机”一直在我心头挥之不去,所以首先想到的是遍历所有格子,每次随机挑一个Q放进去,但立刻意识到这样很有可能导致死锁,尤其Q很小的时候,然后举了个死锁的例子。
2. 因为之前考虑过Q很小,所以最简单就是{0, 1}两种,立刻想到国际象棋棋盘:两色相间一定能填满而且无冲突。然后想到能不能先按照国际象棋棋盘填满,然后在这个基础上进行”随机化“。假如我有个遵循前两条规则的函数random(),对棋盘进行随机化。因为是在01棋盘改,所以第一遍下来可能还是很”假“,但既然这个函数是遵循前两条规则的,那么大可放心的多执行几遍。就像PS的滤镜叠加使用~ 然后开始讨论这个random()函数,大体思路是遍历棋盘,对每个格子有0.5 的概率进行”尝试修改“。(随机化就是一个慢慢tweak的过程,这个参数后面提到要根据实际效果调整)。尝试修改的算法就是:q = random(0, Q); 以q为中心向上下左右四个方向,一共有6条长度为3的线会造成潜在冲突,因此逐个检查一遍,假如无冲突就把当前位置替换为q。最后根据实际效果决定是否再来几次~
3. 然后就剩第三条规则:开局至少有一步能走。我上面阐述的时候就一直有个感觉,每局开始看似随机但一定有定势。然后让小哥打开手机游戏开了两局看了下,果然,每局开头一定会有{V型, _/型} 中的一种或两种排列,保证挪一步就能消除。跟小哥聊了这个想法之后,我的做法就是01棋盘生成后,随机选一个排列,比如V型,然后在棋盘上随机选一个(也可以多个)位置,把这个位置画出的V全部mark成不可修改。然后在这个基础上跑上面提到的random()算法。第三条规则也可以有很多随机性,必须类型选择,类型对应位置、个数的选择。
聊到这儿已经超时了。我问小哥这背后怎么实现的,他说他也不知道。。感觉这题很开放,不一定涉及多么高级的算法,几个随机参数的调整或许就能让开局看上去足够无规律了
Read full article from Google – Initialize Board