基於要查找的次數來決定是否要預處理。預處理方式按照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