1. 程式人生 > 其它 >l洛谷第二題

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
	}
}