知識點:模擬
?
題目描述
《昨日方舟》是一款塔防類游戲。在游戲中,我們要通過部署角色來抵御怪物的入侵。在這款游戲中,有一名角色名字為 “今”,他的能力為能夠在地圖上部署小蛇,小蛇在某些條件下可以與其他小蛇合體,成為大蛇,大蛇不能再與其他小蛇或大蛇合成。
現在有一個大小為 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.排序排反了,是最晚放置的,我排成最早了