井字游戏
设计一个算法,判断玩家是否赢了井字游戏。输入是一个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”
解释: 没有玩家获胜且仍存在空位
function tictactoe(board){
var winner = "";
var hasEmpty = false;
const N = board[0].length;
var diagonal = '';
var diagonal2 = ''
for(let i=0;i<board.length;i++){//行
let item = board[i];
diagonal+=item[i];//主对角线
diagonal2+=item[N-1-i];//副对角线
if(item.indexOf(' ')>=0){
hasEmpty = true;
continue;
}
if(isEqual(item,N)){
return item[0];
}
}
if(isEqual(diagonal,N)){
return diagonal[0];
}
if(isEqual(diagonal2,N)){
return diagonal2[0];
}
const anotherBoard = board.map((item,row) => {
const newItem = item.split('').map((str,col) => board[col][row]);
return newItem.join('');
});
for(let i=0;i<anotherBoard.length;i++){//列
let item = anotherBoard[i];
if(item.indexOf(' ')>=0){
hasEmpty = true;
continue;
}
if(isEqual(item,N)){
return item[0];
}
}
if(hasEmpty){
return "Pending";
}else{
return "Draw";
}
}
function isEqual(item,N){
if(item[0]===' ') return false;
if(item.length===1){
return true;
}
var j=0;
while(item[j]==item[++j] && j<N){
if(j==N-1){
return true;
}
}
return false;
}
var board = ["O X"," XO","X O"];
var res = tictactoe(board);
console.log(res);
用了矩阵转置
。
主要思路是,先检测 行,然后检测 对角线,最后检测 列。
本练习题来自leetcode。