基于要查找的次数来决定是否要预处理。预处理方式按照3进制来做。
另外,检查是否赢了要判断横行,纵列,正反对角线
package Moderate;
/**
* Design an algorithm to figure out if someone has won in a game of tic-tac-toe.
译文:
设计算法检查某人是否赢得了井字游戏。
*
*/
public class S17_2 {
// 方法一:如果HasWon函数需要被频繁调用
public static int convertBoardToInt(char[][] board) {
int factor = 1;
int sum = 0;
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
int v = 0;
switch(board[i][j]){
case 'x':
v = 1;
break;
case 'o':
v = 2;
break;
default:
v = 0;
}
sum += v * factor;
factor *= 3;
}
}
return sum;
}
// 方法二:如果HasWon函数只被调用一次或很少次
public static char hasWon(char[][] board){
int type = 0;
int N = board.length;
int i, j;
// 对每一行都检查
for(i=0; i<N; i++){
if(board[i][0] != ' '){
for(j=1; j<N; j++){
if(board[i][j] != board[i][j-1]){
break;
}
}
if(j == N){
return board[i][0];
}
}
}
// 对每一列都检查
for(j=0; j<N; j++){
if(board[0][j] != ' '){
for(i=1; i<N; i++){
if(board[i][j] != board[i-1][j]){
break;
}
}
if(i == N){
return board[0][j];
}
}
}
// 正对角线检查(左上到右下)
if(board[0][0] != ' '){
for(i=1; i<N; i++){
if(board[i][i] != board[i-1][i-1]){
break;
}
}
if(i == N){
return board[0][0];
}
}
// 逆对角线检查(左下到右上)
if(board[N-1][0] != ' '){
for(i=1; i<N; i++){
if(board[N-i-1][i] != board[N-i][i-1]){
break;
}
}
if(i == N){
return board[N-1][0];
}
}
return ' ';
}
public static void main(String[] args) {
char[][] board = {
{'x', 'x', 'o'},
{' ', 'x', ' '},
{' ', ' ', 'x'}};
int v = convertBoardToInt(board);
System.out.println(v);
char result = hasWon(board);
if(result == ' '){
System.out.println("No one won!");
}else{
System.out.println(result + " has won");
}
}
}