知识点:模拟
题目描述
《昨日方舟》是一款塔防类游戏。在游戏中,我们要通过部署角色来抵御怪物的入侵。在这款游戏中,有一名角色名字为 “今”,他的能力为能够在地图上部署小蛇,小蛇在某些条件下可以与其他小蛇合体,成为大蛇,大蛇不能再与其他小蛇或大蛇合成。
现在有一个大小为 nnn 行 mmm 列的地图,自上往下分别为第 111 行……第 nnn 行,自左往右为第 111 列……第 mmm 列。格子分为可部署格和不可部署格。小蛇只能部署在可部署格上,并且小蛇在部署时,会有一个确定的朝向。
大蛇的合成规则如下:
1. 若当前部署的小蛇所面向的相邻格子中存在另一条小蛇,则当前部署的小蛇消失,面向的小蛇变成大蛇,朝向不变(与原来的小蛇一致)。
2. 若 1 中情况不满足,但存在已经部署的其他小蛇面向当前部署的格子,且与当前部署的格子相邻,那么这些小蛇中最后一条部署的小蛇消失,当前部署的小蛇变成大蛇,朝向与当前部署小蛇一致。
现在给定 n×mn \times mn×m 的地图的每个格子的可部署情况,以及无限只待部署的小蛇,初始状态下地图中不存在小蛇与大蛇,并且按照时间顺序给定 kkk 次尝试部署小蛇的位置和朝向(可能尝试部署在其他小蛇,大蛇和不可部署位置上,此时视作部署失败,不会发生任何事),请输出最后地图上的小蛇与大蛇的存在情况。
输入描述:
输入第 111 行包含 333 个用空格分隔的正整数 n,m,kn, m, kn,m,k ,代表地图的大小与尝试部署的次数。(1≤n,m≤103, 1≤k≤2×105)(1 \leq n,m \leq 10^3,\ 1 \leq k \leq 2\times 10 ^ 5 )(1≤n,m≤103, 1≤k≤2×105)
接下来 nnn 行每行有 mmm 个用空格分隔的整数,第 iii 行第 jjj 个整数代表了地图中第 iii 行第 jjj 列格子的可部署情况,“0” 代表不可部署格,“1” 代表可部署格子。
最后 kkk 行,每行包含 222 个整数 x, yx,\ yx, y 与一个字符 ccc ,第 iii 行表示按照时间顺序,第 iii 次尝试部署的小蛇位置为第 xxx 行第 yyy 列,且朝向为 ccc 。 (1≤x≤n, 1≤y≤m, c∈{u,d,l,r}1 \leq x \leq n,\ 1 \leq y \leq m,\ c \in \{u,d,l,r\}1≤x≤n, 1≤y≤m, c∈{u,d,l,r},u,d,l,ru, d, l, ru,d,l,r 分别代表朝向为上、下、左、右)。
输出描述:
输出 nnn 行,每行包含 mmm 个字符,第 iii 行第 jjj 列的字符 ccc 代表最终地图上第 iii 行第 jjj 列格子的状态。“X” 表示该格为不可部署区域,“O” 表示该格为可部署区域,但不存在小蛇与大蛇部署在该格,“u”, “d”, “l”, “r” 表示该格部署了小蛇,并且朝向为上、下、左、右,“U”, “D”, “L”, “R” 表示该格部署了大蛇,且朝向为上、下、左、右。
示例1
输入
复制2 2 4 1 1 1 1 1 1 r 1 2 l 2 1 l 2 2 r
2 2 4 1 1 1 1 1 1 r 1 2 l 2 1 l 2 2 r
输出
RO lr
示例2
输入
3 9 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 2 d 2 1 r 3 2 u 2 2 r 1 5 d 2 4 r 3 5 u 2 5 d 1 8 d 2 7 r 3 8 u 2 8 r
输出
OdOOdOOdO rROrOOrXO OOOOUOOuO
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
char gz[1010][1010];
int dx[]={-1,1,0,0};//上下左右
int dy[]={0,0,-1,1};
int t[1010][1010];
struct ty{int x,y,t;
};
bool cmp(ty a,ty b){return a.t>b.t;
}
int main(){scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){int a;cin>>a;if(a) gz[i][j]='O';else gz[i][j]='X';}}for(int i=1;i<=k;i++){int a,b;char c;cin>>a>>b>>c;if(gz[a][b]!='O') continue;t[a][b]=i;if(c=='u'){int x=dx[0]+a,y=dy[0]+b;if(gz[x][y]=='d'||gz[x][y]=='u'||gz[x][y]=='l'||gz[x][y]=='r') {if(gz[x][y]=='u') gz[x][y]='U';else if(gz[x][y]=='d') gz[x][y]='D';else if(gz[x][y]=='l') gz[x][y]='L';else if(gz[x][y]=='r') gz[x][y]='R';continue;}}else if(c=='d'){int x=dx[1]+a,y=dy[1]+b;if(gz[x][y]=='d'||gz[x][y]=='u'||gz[x][y]=='l'||gz[x][y]=='r') {if(gz[x][y]=='u') gz[x][y]='U';else if(gz[x][y]=='d') gz[x][y]='D';else if(gz[x][y]=='l') gz[x][y]='L';else if(gz[x][y]=='r') gz[x][y]='R';continue;}}else if(c=='l'){int x=dx[2]+a,y=dy[2]+b;//cout<<x<<" "<<y<<" "<<gz[x][y]<<endl;if(gz[x][y]=='d'||gz[x][y]=='u'||gz[x][y]=='l'||gz[x][y]=='r') {if(gz[x][y]=='u') gz[x][y]='U';else if(gz[x][y]=='d') gz[x][y]='D';else if(gz[x][y]=='l') gz[x][y]='L';else if(gz[x][y]=='r') gz[x][y]='R';continue;}}else if(c=='r'){int x=dx[3]+a,y=dy[3]+b;if(gz[x][y]=='d'||gz[x][y]=='u'||gz[x][y]=='l'||gz[x][y]=='r') {if(gz[x][y]=='u') gz[x][y]='U';else if(gz[x][y]=='d') gz[x][y]='D';else if(gz[x][y]=='l') gz[x][y]='L';else if(gz[x][y]=='r') gz[x][y]='R';continue;}}vector<ty> v;for(int j=0;j<4;j++){int x=a+dx[j];int y=b+dy[j];if(x>n||x<1||y>m||y<1) continue;if(j==0&&gz[x][y]=='d') v.push_back({x,y,t[x][y]});else if(j==1&&gz[x][y]=='u') v.push_back({x,y,t[x][y]});else if(j==2&&gz[x][y]=='r') v.push_back({x,y,t[x][y]});else if(j==3&&gz[x][y]=='l') v.push_back({x,y,t[x][y]});}if(v.size()==0){gz[a][b]=c;continue;}sort(v.begin(),v.end(),cmp);for(int j=0;j<v.size();j++){if(c=='u')gz[a][b]='U';else if(c=='d') gz[a][b]='D';else if(c=='r') gz[a][b]='R';else if(c=='l') gz[a][b]='L';gz[v[j].x][v[j].y]='O';break;}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<gz[i][j];}cout<<endl;}
}
WA的原因:
1.dx和dy数组的上下和左右弄反了,好多次了!!!
2.排序排反了,是最晚放置的,我排成最早了