题目描述
思路
首先明确井字游戏的规则。
X
先放- 当走完所有的格子时,且没有分出胜负时,
X
的数量比O
的数量多1
。 - 当
X
赢了时,X
的数量比O
的数量多1
。 - 当
O
赢了时,X
的数量和O
的数量相同。
所以明白了什么情况下时非法(即返回false
):
- 走慢了格子且
X
的数量不等于O+1
。 X
赢了,且X的数量不等于O+1
。O
赢了,且X的数量不等于O
。- 其余情况全部返回
true
。
完整代码
class Solution {
public:
bool win(vector<string>& board,char ch)
{
//假性的win
for(int i=0;i<3;i++)
{
if(ch==board[0][i]&&ch==board[1][i]&&ch==board[2][i])
{
return true;
}
if(ch==board[i][0]&&ch==board[i][1]&&ch==board[i][2])
{
return true;
}
}
if(ch==board[0][0]&&ch==board[1][1]&&ch==board[2][2])
{
return true;
}
if(ch==board[2][0]&&ch==board[1][1]&&ch==board[0][2])
{
return true;
}
return false;
}
bool validTicTacToe(vector<string>& board)
{
bool Win_X=win(board,'X');
bool Win_O=win(board,'O');
unordered_map<char,int> map;
for(auto str : board)
{
for(auto ch : str)
{
map[ch]++;
}
}
if(map['O']!=map['X']&&map['O']!=map['X']-1)
{
return false;
}
if(win(board,'X')&&map['O']!=map['X']-1)
{
return false;
}
if(win(board,'O')&&map['X']!=map['O'])
{
return false;
}
return true;
}
};
总结
当合法的情况太多导致不好枚举时,可以考虑用反证法,将非法的情况表达出来,剩余的全为合法。