井字游戏
https://leetcode.cn/problems/tic-tac-toe-lcci/description/
题目分析
一个N*N 的棋盘,有两个人在空位置放元素,不论中间如何放置,结果是如果出现N个相同元素处于同一行或同一列或同一对角线,就算赢; 没有赢的情况下,如果出现字符数组中包含空格返回Pending,其他情况返回Draw;
解题思路
1.输入的一维board数组转化为二维数组,主要方便遍历元素;
2.基于每行的判断,行不变,列+1,中间遇到空格字符或不相等字符时break, 当列==N时,说明这一行的字符都相等,则返回第一个字符;
3.基于每列的判断,列不变,行+1,中间遇到空格字符或不相等字符时break,当行 == N时,说明这一列的字符都相等,则返回第一个字符;
4.基于对角线判断,正向的(行+1,列+1) ,反向的(行-1,列+1),判断逻辑与行,和列的判断相同,区别是赢得情况下返回字符条件不同,正向赢的条件:(行== N && 列== N),反向赢的条件(行 <0 && 列== N);
代码实现
public String tictactoe(String[] board) {
if(board == null || board.length <= 0){
return null;
}
int m = board.length;
char[][] charArray = new char[m][m];
int row = 0;
int index = 0;
while (row < m) {
int col = 0;
while(col < m){
charArray[row][col] = board[index].charAt(col);
col++;
}
row++;
index++;
}
//检测行
System.out.println("基于行判断");
for(int i = 0;i < m;i++){
char firstChar = ' ';
int j = 0;
for(;j < m;j++){
if(charArray[i][j] ==' '){
break;
}else{
if(j == 0){
firstChar = charArray[i][j];
}else{
if(charArray[i][j] != firstChar){
break;
}
}
}
}
System.out.println("j="+j);
if(j == m){
return ""+firstChar;
}
}
System.out.println("基于列判断");
//基于列
for(int j = 0;j< m ;j++){
char firstChar = ' ';
int i = 0;
for(; i< m;i++){
if(charArray[i][j] == ' '){
break;
}else{
if(i == 0){
firstChar = charArray[i][j];
}else{
if(charArray[i][j] != firstChar){
break;
}
}
}
}
System.out.println("i="+i+";j="+j);
if(i == m){
return ""+firstChar;
}
}
//基于对角线,行,列各加1
int i = 0;
int j = 0;
char firstChar= ' ';
while(i < m && j < m){
if(charArray[i][j] == ' '){
break;
}else{
if(i == 0){
firstChar = charArray[i][j];
}else{
if(charArray[i][j] != firstChar){
break;
}
}
i++;
j++;
}
}
System.out.println("i="+i+";j="+j);
if(i == m && j == m){
return ""+firstChar;
}
//基于对角线,行-1,列+1
int k = m-1; //行
int l = 0; //列
char secondChar = ' ';
while(k >= 0 && l < m){
if(charArray[k][l] == ' '){
break;
}else{
if(k == m-1){
secondChar = charArray[k][l];
} else{
if(charArray[k][l] != secondChar){
break;
}
}
k--;
l++;
}
}
System.out.println("k="+k+";l="+l);
if(k < 0 && l == m){
return ""+secondChar;
}
//没有人赢的情况下,判断是否存在空字符
for(int g = 0;g < m;g++){
for(int h = 0;h < m;h++){
if(charArray[g][h] == ' '){
return "Pending";
}
}
}
return "Draw";
}
网友评论