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