python井字棋判断胜负_LeetCode 348. 判定井字棋胜负

本文介绍如何设计一个在n×n网格上玩井字棋的Tic-tac-toe游戏,包括游戏规则和玩家获胜条件。通过维护行、列、对角线的玩家标记计数来判断游戏状态。当某一行、列或对角线的标记数达到n时,对应玩家获胜。
摘要由CSDN通过智能技术生成

题目描述

设计一个在n×n网格上两个玩家之间玩的Tic-tac-toe游戏。

您可以假定以下规则:

1.一个移动被保证是有效的,并且被放置在一个空块上。

2.一旦达到获胜条件,就不再允许移动。

3.成功地在水平、垂直或对角线行中放置n个分数的玩家赢得比赛。

样例

Given n = 3, assume that player 1 is "X" and player 2 is "O" in the board.

TicTacToe toe = new TicTacToe(3);

toe.move(0, 0, 1); -> Returns 0 (no one wins)

|X| | |

| | | | // Player 1 makes a move at (0, 0).

| | | |

toe.move(0, 2, 2); -> Returns 0 (no one wins)

|X| |O|

| | | | // Player 2 makes a move at (0, 2).

| | | |

toe.move(2, 2, 1); -> Returns 0 (no one wins)

|X| |O|

| | | | // Player 1 makes a move at (2, 2).

| | |X|

toe.move(1, 1, 2); -> Returns 0 (no one wins)

|X| |O|

| |O| | // Player 2 makes a move at (1, 1).

| | |X|

toe.move(2, 0, 1); -> Returns 0 (no one wins)

|X| |O|

| |O| | // Player 1 makes a move at (2, 0).

|X| |X|

toe.move(1, 0, 2); -> Returns 0 (no one wins)

|X| |O|

|O|O| | // Player 2 makes a move at (1, 0).

|X| |X|

toe.move(2, 1, 1); -> Returns 1 (player 1 wins)

|X| |O|

|O|O| | // Player 1 makes a move at (2, 1).

|X|X|X|

算法1

思路:

1.定义二维数组rows,cols,一维数组diag,adiag

rows[i][j]:i代表矩阵第i行,j代表第j个玩家;rows[i][j]表示第j个玩家占领了第i行的多少个位置

cols[i][j]:i代表矩阵第i列,j代表第j个玩家;cols[i][j]表示第j个玩家占领了第i列的多少个位置

diag[i]:i代表第i个玩家,diag[i]表示第i个玩家占领了正对角线的多少个位置

adiag[i]:i代表第i个玩家,adiag[i]表示第i个玩家占领了反对角线的多少个位置

2.如果占领位置总数到达n,表示玩家赢了

C++ 代码

class TicTacToe {

public:

vector> rows;

vector> cols;

vector diag;

vector adiag;

int size;

/** Initialize your data structure here. */

TicTacToe(int n) {

size = n;

rows.resize(n, vector(2, 0));

cols.resize(n, vector(2, 0));

diag.resize(2);

adiag.resize(2);

}

int move(int row, int col, int player) {

rows[row][player - 1] ++;

if (rows[row][player - 1] == size) return player;

cols[col][player - 1] ++;

if (cols[col][player - 1] == size) return player;

if (row == col) {

diag[player - 1] ++;

if (diag[player - 1] == size) return player;

}

if (row + col == size - 1) {

adiag[player - 1] ++;

if (adiag[player - 1] == size) return player;

}

return 0;

}

};

/**

* Your TicTacToe object will be instantiated and called as such:

* TicTacToe obj = new TicTacToe(n);

* int param_1 = obj.move(row,col,player);

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值