列表

详情


NC244742. 可莉的五子棋

描述

可莉最近沉迷于蒙德五子棋,她在棋盘上放了一些棋子。

蒙德五子棋的规则如下。

给定一个n*m的棋盘。棋盘上有两种棋子“1”和“2”,其中每种棋子分别计算得分。

假如相同种类的五个棋子连成相邻的一行,一列,或斜对角线的情况,每有五个这样的棋子,该种类棋子加1分。

可莉已经把她的棋子都摆在了棋盘上。

但是可莉不太聪明的样子,她希望你,聪明的旅行者,告诉她,她两种棋子的得分。

输入描述

第一行两个整数n,m,表示棋盘的大小。
接下来输入一个n*m的矩阵,表示棋盘。
“1”,“2”表示该位置有对应的棋子。
“0”表示该位置没有棋子。

输出描述

一行2个整数,以空格隔开,表示“1”,“2”两种棋子各自的得分。

示例1

输入:

20 20
10202022021000221222
22111122221221101010
11211001210010001210
02222120211010112111
21220011111022120012
00111101111212221010
22122012211221212111
22102022221121110211
20222121122221221121
10012221102212201222
12110201221022101111
02212201100112112111
22111222202221211110
12112222222122102121
21021120121212010221
10222001121022022112
11111201112100221021
12112102021200111100
21021021011222222202
12021221122012111212

输出:

10 12

原站题解

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

pypy3 解法, 执行用时: 991ms, 内存消耗: 35036K, 提交时间: 2023-02-16 17:02:57

l = [int(i) for i in input().split()]
n = l[0]
m = l[1]
map = []
mode = [[1,0],[0,1],[1,1],[-1,1]]
cout = [0,0]
def score(r,c,n,nn):
    rr = mode[nn][0]
    cc =mode[nn][1]  
    for i in range(5):
        if i==4:
            cout[n-1] = cout[n-1] + 1
            break
        if map[r + rr*(i+1)][c + cc*(i+1)] != n:
            break
for i in range(n):
    colom = input()
    map.append([0,0,0,0]+[int(colom[i]) for i in range(m)]+[0,0,0,0])
for op in range(4):
    map.append([0]*(m+8))
for r in range(n):
    for c in range(m):
        for ii in range(4):
            if map[r][c+4] == 0:
                break
            score(r,c+4,map[r][c+4],ii)
print(cout[0],cout[1])

C++(g++ 7.5.0) 解法, 执行用时: 52ms, 内存消耗: 1404K, 提交时间: 2022-11-05 13:46:24

#include<iostream>
using namespace std;
int N=1010;
typedef long long ll;

char ch[1010][1010];
int n,m;
int fun(char c)
{
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			int k1=1,k2=1,k3=1,k4=1;
			for(int k=0;k<5;k++)
			{
				if(j+k>m||ch[i][j+k]!=c)k1=0;
				if(i+k>n||ch[i+k][j]!=c)k2=0;
				if(j+k>m||i+k>n||ch[i+k][j+k]!=c)k3=0;
				if(j-k<1||i+k>n||ch[i+k][j-k]!=c)k4=0;
			}	
			cnt+=k1+k2+k3+k4;	
		}
	}
	return cnt;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
        cin>>ch[i]+1;
    cout<<fun('1')<<" "<<fun('2')<<endl;
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 189ms, 内存消耗: 2392K, 提交时间: 2022-11-18 22:30:33

#include<iostream>
using namespace std;
char g[1005][1005];
int n,m;

int bfs(char c){

int cnt=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
int k1=1,k2=1,k3=1,k4=1;
for(int k=0;k<5;++k){
if(i+k>n|| g[i+k][j]!=c)k1=0;
if(j+k>m|| g[i][j+k]!=c)k2=0;
if(i+k>n||j+k>m|| g[i+k][j+k]!=c)k3=0;
if(i+k>n||j-k<1|| g[i+k][j-k]!=c)k4=0;

}
cnt+=k1+k2+k3+k4;


}

}

return cnt;
}




int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)scanf("%s",g[i]+1);
cout<<bfs('1')<<' '<<bfs('2')<<endl;
    return 0;
}




上一题