NC200286. Baba is You
描述
输入描述
第一行包含三个正整数,相邻正整数之间使用一个空格符分隔,分别表示可见地图的行数、列数,和操作序列长度。
之后连续输入n行,每行m个字符,由"."和ASCII英文小写字母组成,代表可见地图。
之后输入q行,每行都属于题目描述中的操作格式之一。
数据规范:
* .
* 保证输入的初始地图上每个位置最多有一个物品。
* 保证输入的初始地图上至少存在一个物品。
输出描述
输出包含n行m列,即执行全部操作后的可见地图部分。
如果某个位置有多个物品,则用"+"表示。
示例1
输入:
5 5 5 .a... ..b.. ...c. ....d d.... a is you SD c is a d is you W
输出:
..... ..+.. ...ad d.... .....
示例2
输入:
3 3 5 a.. b.. .c. a is you SD b is a WD c is a
输出:
.aa ... .a.
示例3
输入:
2 2 2 bb aa b is you a is b
输出:
bb bb
示例4
输入:
3 3 6 .a. .b. .a. a is you DS b is c W c is a D
输出:
... ..a ...
C++11(clang++ 3.9) 解法, 执行用时: 77ms, 内存消耗: 3444K, 提交时间: 2019-12-08 15:29:14
#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define gt(x) x = read() using namespace std; const int mxn = 1007; const int mxm = 2e5+7; int n,m,q,me,movx[30],movy[30],f[30],id[mxn][mxn]; char mp[mxn][mxn],ans[mxn][mxn],in[mxm],rec[30]; inline int read(int out = 0) { char c; while((c=getchar()) < 48 || c > 57); while(c >= 48 && c <= 57) out=out*10+c-48,c=getchar(); return out; } int find(int x){return f[x] == x ? x : find(f[x]); } void work() { for(int i = 1;i <= (int)strlen(in+1);++i) { for(int j = 1;j <= 27;++j) { if(find(j) == find(me)) { if(in[i] == 'W') --movx[j]; if(in[i] == 'S') ++movx[j]; if(in[i] == 'A') --movy[j]; if(in[i] == 'D') ++movy[j]; } } } } int main() { gt(n),gt(m),gt(q); for(int i = 1;i <= n;++i) { for(int j = 1;j <= m;++j) { mp[i][j] = getchar(); ans[i][j] = '.'; } getchar(); } for(int i = 1;i <= 27;++i) f[i] = i; while(q--) { scanf("%s",in+1); if(in[1] < 'a'){work();continue;} scanf("%s",rec+1); scanf("%s",rec+1); if((int)strlen(rec+1) == 3){me = in[1]-'a'+1;continue;} int x = find(in[1]-'a'+1),y = find(rec[1]-'a'+1); f[x] = y; } int fin,nowx,nowy; for(int i = 1;i <= n;++i) for(int j = 1;j <= m;++j) { if(mp[i][j] != '.') { fin = find(mp[i][j]-'a'+1); nowx = i+movx[mp[i][j]-'a'+1],nowy = j+movy[mp[i][j]-'a'+1]; if(nowx > 0 && nowx <= n && nowy > 0 && nowy <= m) { if(ans[nowx][nowy] == '.') ans[nowx][nowy] = fin+'a'-1; else ans[nowx][nowy] = '+'; } } } for(int i = 1;i <= n;++i) { for(int j = 1;j <= m;++j) putchar(ans[i][j]); putchar('\n'); } return 0; }