Google – Initialize Board


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

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts