l洛谷第二題
阿新 • • 發佈:2022-04-03
題目描述
給定一個 n\times nn×n 的正方形棋盤,幾位玩家在上面玩三子棋。
三子棋的規則是每位玩家輪流寫下一個字母,同一名玩家的字母相同。當有一名玩家在行、列或者斜線上連續組成了 33 個自己的字母時,即為獲勝。
給定棋盤的當前狀態,請找出獲勝的玩家。
輸入格式
輸入第一行為一個整數 nn。
接下來的 nn 行,每行 nn 個字元,可能為大寫字母或 .
(表示沒人在這下棋)。
輸出格式
輸出一行一個大小字母,表示獲勝的玩家所寫的那種字母。
如果沒有人獲勝,則輸出 ongoing
。
資料保證最多隻有一個人獲勝。
輸入輸出樣例
輸入 #13 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
}
}