l洛谷第二题

题目描述

给定一个 n\times nn×n 的正方形棋盘,几位玩家在上面玩三子棋。

三子棋的规则是每位玩家轮流写下一个字母,同一名玩家的字母相同。当有一名玩家在行、列或者斜线上连续组成了 33 个自己的字母时,即为获胜。

给定棋盘的当前状态,请找出获胜的玩家。

输入格式

输入第一行为一个整数 nn。

接下来的 nn 行,每行 nn 个字符,可能为大写字母或 .(表示没人在这下棋)。

输出格式

输出一行一个大小字母,表示获胜的玩家所写的那种字母。

如果没有人获胜,则输出 ongoing

数据保证最多只有一个人获胜。

输入输出样例

输入 #1
3
XOC
XOC
X..
输出 #1
X
输入 #2
4
....
..A.
AAB.
.B.B
输出 #2
ongoing
输入 #3
3
ABB
AAA
BBA
输出 #3
A

说明/提示

数据规模与约定

对于 100\%100% 的数据,保证 1\le n\le 301n30。

解题思路:

首先先普普通通的输入我们的棋盘

用memset进行初始化

下面写一个判断函数来判断是否有玩家的字母连成一条线,具体判断函数如下关键点。

我们还需要一个sign变量(bool)记录是否有赢家,以此判断是否输出"ongoing"

最后用一个函数输入字母。

关键点:

void JUDGE(int x,int y)
{
	if((MAP[x-1][y]==MAP[x][y])&&(MAP[x+1][y]==MAP[x][y])) 
		OUT(MAP[x][y]);//行
	if((MAP[x][y-1]==MAP[x][y])&&(MAP[x][y+1]==MAP[x][y]))
		OUT(MAP[x][y]);//列
	if((MAP[x-1][y-1]==MAP[x][y])&&(MAP[x+1][y+1]==MAP[x][y]))
		OUT(MAP[x][y]);//斜线
	if((MAP[x+1][y-1]==MAP[x][y])&&(MAP[x-1][y+1]==MAP[x][y]))
		OUT(MAP[x][y]);//斜线
}

具体代码:
#include<bits/stdc++.h>
using namespace std;

int n;
char MAP[35][35];
bool sign=true;//记录是否有赢家
void JUDGE(int,int),OUT(char);

int main()
{
	memset(MAP,0,sizeof(MAP));
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>MAP[i][j];
	for(int i=1;i<=n&&sign;i++)//循环必须判断sign情况 不然可能重复输出
		for(int j=1;j<=n&&sign;j++)
			JUDGE(i,j);
	if(sign)//若遍历后无赢家输出"ongoing"
		printf("ongoing");
	return 0;
}

void JUDGE(int x,int y)
{
	if((MAP[x-1][y]==MAP[x][y])&&(MAP[x+1][y]==MAP[x][y])) 
		OUT(MAP[x][y]);//行
	if((MAP[x][y-1]==MAP[x][y])&&(MAP[x][y+1]==MAP[x][y]))
		OUT(MAP[x][y]);//列
	if((MAP[x-1][y-1]==MAP[x][y])&&(MAP[x+1][y+1]==MAP[x][y]))
		OUT(MAP[x][y]);//斜线
	if((MAP[x+1][y-1]==MAP[x][y])&&(MAP[x-1][y+1]==MAP[x][y]))
		OUT(MAP[x][y]);//斜线
}

void OUT(char c)
{
	if(c!='.')//棋盘中可能有连续3个'.'构成的线
	{	
		printf("%c",c);
		sign=false;//更新sign
	}
}
 
posted @ 2022-04-03 17:31  冉思银  阅读(55)  评论(0)    收藏  举报