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