設計一個算法,判斷玩家是否贏了井字遊戲

基於要查找的次數來決定是否要預處理。預處理方式按照3進制來作。java

另外,檢查是否贏了要判斷橫行,縱列,正反對角線面試

解法:算法

假設這個檢查某人是否贏得了井字遊戲的函數爲HasWon,那麼咱們第一步要向面試官確認, 這個函數是隻調用一次,仍是要屢次頻繁調用。若是是屢次調用, 咱們能夠經過預處理來獲得一個很是快速的版本。數組

方法一:若是HasWon函數須要被頻繁調用app

對於井字遊戲,每一個格子能夠是空,個人棋子和對方的棋子3種可能,總共有39 = 19683 種可能狀態。咱們能夠把每一種狀態轉換成一個整數, 預處理時把這個狀態下是否有人贏得了井字遊戲保存起來,每次檢索時就只須要O(1)時間。 好比每一個格子上的3種狀態爲0(空),1(我方棋子),2(對方棋子),棋盤從左到右, 從上到下依次記爲0到8,那麼任何一個狀態均可以寫成一個3進制的數,再轉成10進制便可。 好比,下面的狀態:函數

1 2 2
2 1 1
2 0 1
能夠寫成:
122211201=1*3^8 + 2*3^7 +...+ 0*3^1 + 1*3^0

這時,須要一個19683 大的數組來存放每個計算出的整數表示哪一方贏了,或者出現平局。spa

若是隻須要返回是否有人贏,而不須要知道是我方仍是對方。 那能夠用一個二進制位來表示是否有人贏。好比上面的狀態,1贏, 就能夠把那個狀態轉換成的數對應的位置1。若是須要知道是誰贏, 能夠用一個char數組來保存預處理結果。.net

方法二:若是HasWon函數只被調用一次或不多次設計

若是HasWon函數只被調用一次或不多次,那咱們就不必去預存結果了, 直接判斷一下就好。只爲一次調用去作預處理是不值得的。code

代碼以下,判斷n*n的棋盤是否有人贏,即同一棋子連成一線:

從上到下,從左到右,兩條對角線

 

 

[java] view plain copy

在CODE上查看代碼片派生到個人代碼片

  1. package Moderate;  
  2.   
  3. /** 
  4.  * Design an algorithm to figure out if someone has won in a game of tic-tac-toe. 
  5.  
  6. 譯文: 
  7.  
  8. 設計算法檢查某人是否贏得了井字遊戲。  
  9.  * 
  10.  */  
  11. public class S17_2 {  
  12.   
  13.     // 方法一:若是HasWon函數須要被頻繁調用  
  14.     public static int convertBoardToInt(char[][] board) {  
  15.         int factor = 1;  
  16.         int sum = 0;  
  17.         for (int i = 0; i < board.length; i++) {  
  18.                 for (int j = 0; j < board[i].length; j++) {  
  19.                         int v = 0;  
  20.                         switch(board[i][j]){  
  21.                             case 'x':  
  22.                                 v = 1;  
  23.                                 break;  
  24.                             case 'o':  
  25.                                 v = 2;  
  26.                                 break;  
  27.                             default:  
  28.                                 v = 0;  
  29.                         }  
  30.                           
  31.                         sum += v * factor;  
  32.                         factor *= 3;  
  33.                 }  
  34.         }  
  35.         return sum;  
  36.     }  
  37.       
  38.       
  39.     // 方法二:若是HasWon函數只被調用一次或不多次  
  40.     public static char hasWon(char[][] board){  
  41.         int type = 0;  
  42.         int N = board.length;  
  43.           
  44.         int i, j;  
  45.           
  46.         // 對每一行都檢查  
  47.         for(i=0; i<N; i++){  
  48.             if(board[i][0] != ' '){  
  49.                 for(j=1; j<N; j++){  
  50.                     if(board[i][j] != board[i][j-1]){  
  51.                         break;  
  52.                     }  
  53.                 }  
  54.                 if(j == N){  
  55.                     return board[i][0];  
  56.                 }  
  57.             }  
  58.         }  
  59.           
  60.           
  61.         // 對每一列都檢查  
  62.         for(j=0; j<N; j++){  
  63.             if(board[0][j] != ' '){  
  64.                 for(i=1; i<N; i++){  
  65.                     if(board[i][j] != board[i-1][j]){  
  66.                         break;  
  67.                     }  
  68.                 }  
  69.                 if(i == N){  
  70.                     return board[0][j];  
  71.                 }  
  72.             }  
  73.         }  
  74.           
  75.         // 正對角線檢查(左上到右下)  
  76.         if(board[0][0] != ' '){  
  77.             for(i=1; i<N; i++){  
  78.                 if(board[i][i] != board[i-1][i-1]){  
  79.                     break;  
  80.                 }  
  81.             }  
  82.             if(i == N){  
  83.                 return board[0][0];  
  84.             }  
  85.         }  
  86.           
  87.         // 逆對角線檢查(左下到右上)  
  88.         if(board[N-1][0] != ' '){  
  89.             for(i=1; i<N; i++){  
  90.                 if(board[N-i-1][i] != board[N-i][i-1]){  
  91.                     break;  
  92.                 }  
  93.             }  
  94.             if(i == N){  
  95.                 return board[N-1][0];  
  96.             }  
  97.         }  
  98.           
  99.         return ' ';  
  100.     }  
  101.   
  102.   
  103.   
  104.     public static void main(String[] args) {  
  105.             char[][] board = {  
  106.                             {'x', 'x', 'o'},  
  107.                             {' ', 'x', ' '},  
  108.                             {' ', ' ', 'x'}};  
  109.               
  110.             int v = convertBoardToInt(board);  
  111.             System.out.println(v);  
  112.               
  113.             char result = hasWon(board);  
  114.             if(result == ' '){  
  115.                 System.out.println("No one won!");  
  116.             }else{  
  117.                 System.out.println(result + " has won");  
  118.             }  
  119.               
  120.     }  
  121.   
  122. }  
相關文章
相關標籤/搜索