列表

详情


NC54791. 五子棋

描述

因为课程太无聊,weg范和da帝决定在纸上下五子棋。已知纸张被划分为 个格子的棋盘,其中 '*' 表示该位置没有棋子,'w'表示该位置是白棋,'b'表示该位置是黑棋。下课后,两人把棋盘留在了座位上并被你发现。请你根据纸上的棋子判断两人胜负结果。

输入描述

第一行是一个整数,表示有组数据。对于每组数据,第一行为一个整数,表示棋盘的大小,接着行字符串,表示两人的对局情况。

输出描述

请你根据两人的对局情况输出胜负。如果白棋赢了输出"FYMNB",黑棋赢了输出"DDNB",如果两者都没赢则输出"PINGJU"。

示例1

输入:

3
5
wb***
*w***
*bw**
*b*w*
*b**w
5
bwbwb
bwbwb
wbwwb
bwbwb
wwwbb
5
*****
***b*
*w**b
***w*
*bw**

输出:

FYMNB
DDNB
PINGJU

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 500K, 提交时间: 2023-04-03 20:36:41

#include<bits/stdc++.h>
using namespace std;
int a[101][101];
int main()
{
	int fun(int i,int j);
	int t,n,i,j;
	cin>>t;
	while(t--)
	{
		cin>>n;
		memset(a,0,sizeof a);
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)
			{
				char c;
				cin>>c;
				if(c=='w')
				a[i][j]=1;
				else if(c=='b')
				a[i][j]=2;
				else
				a[i][j]=0;
			}
		}
		int tep=0;
		for(i=1;i<=n;i++)
		{
			int flag=false;
			for(j=1;j<=n;j++)
			{
				if(a[i][j]&&fun(i,j))
				{
					tep=a[i][j];
					flag=true;
					break;
				}
			}
				if(flag)
				break;
		}
		if(tep==1)
		cout<<"FYMNB"<<endl;
		else if(tep==2)
		cout<<"DDNB"<<endl;
		else
		cout<<"PINGJU"<<endl;
	}
	return 0;
}
int fun(int i,int j)
{
	int op=a[i][j];
	if(a[i+1][j]==op&&a[i+2][j]==op&&a[i+3][j]==op&&a[i+4][j]==op)
	return true;
	if(a[i][j+1]==op&&a[i][j+2]==op&&a[i][j+3]==op&&a[i][j+4]==op)
	return true;
	if(a[i+1][j+1]==op&&a[i+2][j+2]==op&&a[i+3][j+3]==op&&a[i+4][j+4]==op)
	return true;
	if(j>=5&&a[i+1][j-1]==op&&a[i+2][j-2]==op&&a[i+3][j-3]==op&&a[i+4][j-4]==op)
	return true;
	return false;
}

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 416K, 提交时间: 2023-05-25 12:48:49

#include <iostream>
#include <algorithm>
using namespace std;
char q[15][15];
int nx[4] = { 1,1,1,0 }, ny[4] = { -1,0,1,1 }, n;
bool kami;
void asd(int x,int y,char z,int o,int v) {
	if (o == 5) {
		if (z == 'w') {
			kami = true;
			cout << "FYMNB" << endl;
		}
		if(z=='b'){
			kami = true;
			cout << "DDNB" << endl;
		}
	}
	x += nx[v], y += ny[v];
	if (x > 0 && x <= n && y > 0 && y <= n) if (q[x][y] == z) asd(x, y, z, o + 1, v);
}
int main(){
	int t;
	cin >> t;
	while (t--) {
        kami=false;
		cin >> n;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) cin >> q[i][j];
		}
		for (int i = 1; i <= n&&kami==0; i++) {
			for (int j = 1; j <= n&&kami==0; j++) {
				if (q[i][j] != '*') {
					for (int v = 0; v < 4; v++) asd(i, j, q[i][j], 1, v);
				}
			}
		}
		if (!kami) cout << "PINGJU" << endl;
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 484K, 提交时间: 2019-12-08 14:43:15

#include <bits/stdc++.h>

using namespace std;

int main()
{
    for (int t, n = scanf("%d", &t), check, ans[2], arr[17][17][4][2]; t-- && (memset(arr, 0, sizeof(arr)), ans[0] = ans[1] = 0, scanf("%d", &n)); cout << vector<string>{"PINGJU", "FYMNB", "DDNB"}[((ans[0] >= 5) << 1) | (ans[1] >= 5)] << endl)
        for (int i = 1; i <= n && getchar(); i++)
            for (int j = 1, ch; j <= n; scanf("%c", &ch), ch = *(char *)&ch, ch != '*' && (check = ch == 'w', ans[check] = max({ans[check], arr[i][j][0][check] = arr[i - 1][j][0][check] + 1, arr[i][j][1][check] = arr[i][j - 1][1][check] + 1, arr[i][j][2][check] = arr[i - 1][j - 1][2][check] + 1, arr[i][j][3][check] = arr[i - 1][j + 1][3][check] + 1})), j++)
                ;
    return 0;
}

上一题