一看到井字棋游戏最先想到决策树,这个题是直接判断输赢。注意不是9个格子,是N*N个格子。那么第一步应该把一维数组放到二维数组中,否则无法遍历。
遇到X,转换成1。遇到O,转换成-1。否则为0
遍历二维数组的每一行,每一列,两条对角线。如果和为N,则输出"X",和为-N,则输出"O"。遍历时需要保存0的数量,用于判断还有没有空位。flag表示有无胜利者。
class Solution {
public String tictactoe(String[] board) {
int n = board.length;
int ox[][] = new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(board[i].charAt(j) == 'X'){
ox[i][j] = 1;
}else if(board[i].charAt(j) == 'O'){
ox[i][j] = -1;
}else{
ox[i][j] = 0;
}
}
}
return win(ox);
}
public String win(int nums[][]){
int n=nums.length;
int rowsum=0,colsum=0,zeronum=0,diagonal1=0,diagonal2=0;
boolean flag=false;
for(int i=0;i<nums.length;i++){
rowsum=0;
for(int j=0;j<nums.length;j++){
if(nums[i][j]==0){
zeronum++;
}
rowsum+=nums[i][j];
if(i==j){
diagonal1+=nums[i][j];
}
}
if(rowsum==n){
flag=true;
return "X";
}
if(rowsum==-n){
flag=true;
return "O";
}
}
if(diagonal1==n){
flag=true;
return "X";
}
if(diagonal1==-n){
flag=true;
return "O";
}
for(int j=0;j<n;j++){
colsum=0;
for(int i=0;i<n;i++){
colsum+=nums[i][j];
if(i+j==n-1){
diagonal2+=nums[i][j];
}
}
if(colsum==n){
flag=true;
return "X";
}
if(colsum==-n){
flag=true;
return "O";
}
}
if(diagonal2==n){
flag=true;
return "X";
}
if(diagonal2==-n){
flag=true;
return "O";
}
if(!flag){
if(zeronum==0){
return "Draw";
}else{
return "Pending";
}
}
return null;
}
}