对于一个给定的井字棋棋盘,请设计一个高效算法判断当前玩家是否获胜。

题目:对于一个给定的井字棋棋盘,请设计一个高效算法判断当前玩家是否获胜。

给定一个二维数组board,代表当前棋盘,其中元素为1的代表是当前玩家的棋子,为0表示没有棋子,为-1代
表是对方玩家的棋子。
测试样例:
[[1,0,1],[1,-1,-1],[1,-1,0]]
返回:true

分析:井字棋盘判断玩家是否赢了(3*3的棋盘)由于玩家下的棋子是1,因此判断行和、列和、主对角和、副对角和是否等于3(行数)

bool is_win(const vector<vector<int>>& vv)
{
	int row = vv.size();//二维数组的行数(即棋盘的大小)

	//看有没有行之和是row的
	for (int i = 0; i < row; i++)
	{
		int sum_row = 0;
		int sum_cow = 0;
		for (int j = 0; j < row; j++)
		{
			sum_row += vv[i][j];
			sum_cow += vv[j][i];
		}
		if (sum_row == row)//只要有一行之和是row,就说明玩家赢了
		{
			return true;
		}
		if (sum_cow == row)//只要有一列之和是row,就说明玩家赢了
		{
			return true;
		}
	}

	//看看主对角线、副对角线
	int first = 0;
	int second = 0;
	for (int i = 0; i < row; i++)
	{
		first += vv[i][i];
		second += vv[i][row - 1 - i];
	}
	if (first == row)
	{
		return true;
	}
	if (second == row)
	{
		return true;
	}

	//来到这,说明没有一个可能成功,即失败
	return false;
}

猜你喜欢

转载自blog.csdn.net/lyl194458/article/details/89382261