NC254925. 小红的战争棋盘
描述
输入描述
第一行输入三个正整数,分别代表棋盘的行数、列数,以及势力的数量。
接下来的行,每行输入一个字符串 str,以及两个正整数
和
,代表每个势力的名字,以及初始的坐标为
。保证初始投放的军队是没有重名的。
接下来的一行输入一个正整数,代表回合数。
接下来的行,每行输入一个字符串 str 和一个字符
,代表即将行动的军队的势力名称,以及行动方向。
为 'W'代表该军队向上走,'S'代表向下走,'A'代表向左走,'D'代表向右走。
数据范围:
保证str是长度不超过10的、仅包含小写字母的字符串。保证为'W'、'A'、'S'、'D'四种字符中的一种。
输出描述
对于每次操作,输出一行答案:
若本次移动占领了新的边界,则输出一行字符串"vanquish!"
若本次移动到了自己的领土,则输出一行字符串"peaceful."
若本次由于将移出边界导致移动失败,则输出一行字符串"out of bounds!"
若本次移动发生了冲突,胜利者是xxx,则输出一行字符串"xxx wins!"(xxx为势力名字)
若输入了不存在的势力,或者输入的字符串代表的势力已经败北,则输出一行字符串"unexisted empire."
示例1
输入:
3 3 2 ranko 1 1 kotori 2 2 5 ranko D ranko W ranko A kotori W kotori W
输出:
vanquish! out of bounds! peaceful. ranko wins! unexisted empire.
说明:
示例2
输入:
2 2 2 abcd 1 1 abcad 1 2 1 abcd D
输出:
abcd wins!
说明:
abcd的势力向右移动到(1,2),和abcad势力火拼,两者势力范围相同,但由于"abcd"字符串的字典序更大,因此获得胜利。C++(g++ 7.5.0) 解法, 执行用时: 81ms, 内存消耗: 5968K, 提交时间: 2023-07-24 00:45:43
#include <bits/stdc++.h> #define int long long #define endl "\n" using namespace std; struct Node{ int x,y; }; int mp[505][505],x[20005],y[20005],tot[20005],d[20005]; int n,m,k; string name[20005],tmp;char c; map<string,int> na; vector<Node> z[20005]; void cq(int a,int b){ while(!z[b].empty()){ z[a].push_back(z[b].back()); mp[z[b].back().x][z[b].back().y]=a; z[b].pop_back(); tot[a]++; } cout<<name[a]<<" wins!"<<endl; d[b]=1; } signed main(){ d[0]=1; cin>>n>>m>>k; int tx,ty,xx,yy; for(int i=1;i<=k;++i){ cin>>name[i]; na[name[i]]=i; cin>>x[i]>>y[i]; if(mp[x[i]][y[i]]){ if(name[i]>name[mp[x[i]][y[i]]]){ d[mp[x[i]][y[i]]]=1; }else { d[i]=1; continue; } } tot[i]=1; mp[x[i]][y[i]]=i; z[i].push_back({x[i],y[i]}); } int q; cin>>q; for(int i=1;i<=q;++i){ cin>>tmp>>c; tx=na[tmp]; if(d[tx]){ cout<<"unexisted empire."<<endl; }else { xx=x[tx],yy=y[tx]; if(c=='W')xx-=1; if(c=='S')xx+=1; if(c=='A')yy-=1; if(c=='D')yy+=1; if(xx<1||xx>n||yy<1||yy>m){ cout<<"out of bounds!"<<endl; }else if(mp[xx][yy]==0){ mp[xx][yy]=tx; tot[tx]++; x[tx]=xx,y[tx]=yy; cout<<"vanquish!"<<endl; z[tx].push_back({xx,yy}); }else if(mp[xx][yy]==tx){ x[tx]=xx,y[tx]=yy; cout<<"peaceful."<<endl; }else{ if(tot[tx]>tot[mp[xx][yy]]||(tot[tx]==tot[mp[xx][yy]]&&name[tx]>name[mp[xx][yy]])){ cq(tx,mp[xx][yy]); }else{ cq(mp[xx][yy],tx); } x[tx]=xx,y[tx]=yy; } } } return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 85ms, 内存消耗: 4740K, 提交时间: 2023-07-23 20:26:57
#include <bits/stdc++.h> using namespace std; struct dd{ int x,y; }; int M[505][505],n,m,k,X[20005],Y[20005],tot[20005],D[20005]; string name[20005],tmp;char c; map<string,int> N; vector<dd> z[20005]; void cq(int a,int b){ while(!z[b].empty()){ z[a].push_back(z[b].back()); M[z[b].back().x][z[b].back().y]=a; z[b].pop_back(); tot[a]++; } cout<<name[a]<<" wins!"<<endl; D[b]=1; } int main(){ D[0]=1; cin>>n>>m>>k; int x,y,xx,yy; for(int i=1;i<=k;++i){ cin>>name[i]; N[name[i]]=i; cin>>X[i]>>Y[i]; if(M[X[i]][Y[i]]){ if(name[i]>name[M[X[i]][Y[i]]])D[M[X[i]][Y[i]]]=1; else { D[i]=1;continue; } } tot[i]=1; M[X[i]][Y[i]]=i; z[i].push_back({X[i],Y[i]}); } int q; cin>>q; for(int i=1;i<=q;++i){ cin>>tmp>>c; x=N[tmp]; if(D[x]){ printf("unexisted empire.\n"); }else { xx=X[x],yy=Y[x]; if(c=='W')xx-=1; if(c=='S')xx+=1; if(c=='A')yy-=1; if(c=='D')yy+=1; if(xx<1||xx>n||yy<1||yy>m)printf("out of bounds!\n"); else if(M[xx][yy]==0){ M[xx][yy]=x;tot[x]++; X[x]=xx,Y[x]=yy; printf("vanquish!\n"); z[x].push_back({xx,yy}); }else if(M[xx][yy]==x){ X[x]=xx,Y[x]=yy; printf("peaceful.\n"); }else{ if(tot[x]>tot[M[xx][yy]]||(tot[x]==tot[M[xx][yy]]&&name[x]>name[M[xx][yy]]))cq(x,M[xx][yy]); else cq(M[xx][yy],x); X[x]=xx,Y[x]=yy; } } } return 0; }