难度中等6收藏分享切换为英文关注反馈
设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符" ","X"和"O"组成,其中字符" "代表一个空位。
以下是井字游戏的规则:
- 玩家轮流将字符放入空位(" ")中。
- 第一个玩家总是放字符"O",且第二个玩家总是放字符"X"。
- "X"和"O"只允许放置在空位中,不允许对已放有字符的位置进行填充。
- 当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。
- 当所有位置非空时,也算为游戏结束。
- 如果游戏结束,玩家不允许再放置字符。
如果游戏存在获胜者,就返回该游戏的获胜者使用的字符("X"或"O");如果游戏以平局结束,则返回 "Draw";如果仍会有行动(游戏未结束),则返回 "Pending"。
示例 1:
输入: board = ["O X"," XO","X O"] 输出: "X"
示例 2:
输入: board = ["OOX","XXO","OXO"] 输出: "Draw" 解释: 没有玩家获胜且不存在空位
示例 3:
输入: board = ["OOX","XXO","OX "] 输出: "Pending" 解释: 没有玩家获胜且仍存在空位
提示:
1 <= board.length == board[i].length <= 100
- 输入一定遵循井字棋规则
思路:一开始想着去搜索,但是后面想了一下,其实就有四种情况,就是横,竖,还有两条对角线。所以。我遍历整个图,遇到X就置为1,遇到O就置为-1,遇到“ ”就置为0。遍历完了,然后搜着四种情况,判断值得可能性,在输出相应得结果
package 字符串;
//面试题 16.04. 井字游戏
public class No1604 {
public String tictactoe(String[] board) {
int[][] num=new int[board.length][board[0].length()];
int n=board.length;
int flag=0;
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length();j++){
if(board[i].charAt(j)=='X')
num[i][j]=1;
else if(board[i].charAt(j)=='O')
num[i][j]=-1;
else
num[i][j]=0;
}
}
int num1=0,num2=0,num3=0,num4=0;
for(int i=0;i<board.length;i++) {
num1=0;
for (int j = 0; j < board[i].length(); j++) {
num1 += num[i][j];
if(num[i][j]==0)
flag=1;
}
if(num1==n||num1==-n)
break;
}
for(int i=0;i<board.length;i++){
num2=0;
for(int j=0;j<board[i].length();j++) {
num2 += num[j][i];
}
if(num2==n||num2==-n)
break;
}
for(int i=0;i<board.length;i++){
num3+=num[i][i];
}
for(int i=board.length-1;i>=0;i--){
num4+=num[n-1-i][i];
//System.out.println("num[i][i] "+num[i][i]+" num4"+num4);
}
//System.out.println(n+" "+num1+" "+num2+" "+num3+" "+num4);
if(num1==n||num2==n||num3==n||num4==n){
if((num1==-n)||(num2==-n)||(num3==-n)||(num4==-n)){
if(flag==0) {
return "Draw";
}
else
return "Pending";
}
else{
return "X";
}
}
else{
if(num1==-n||num2==-n||num3==-n||num4==-n){
return "O";
}
else{
if(flag==0)
return "Draw";
else
return "Pending";
}
}
}
}