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 301≤n≤30。
解题思路:
首先先普普通通的输入我们的棋盘
用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
	}
}  
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号