列表

详情


NC200286. Baba is You

描述

Baba is you是一款由芬兰独立开发者Hempuli开发的益智解谜类游戏。游戏操作类似于推箱子,但实际规则远比推箱子更为复杂。游戏玩家操控被指定为"you"的角色,当you被改变,则玩家操纵的角色也会相应的改变,如下图,因为有"Baba is you"的字样,于是玩家初始操纵一个白色的角色 (即Baba),但是修改为了"Robot is you"后,操纵角色就变成了一个棕色的机器人 (即Robot).

玩家也可以借此将一种物品转换为另一种物品,如下图将Baba变成Robot:

这道题需要你编写一个程序,接收输入的游戏地图,之后根据给定的操作序列进行处理(三种操作:将某种物品指定为"You"、将某种物品变成另一种物品、进行移动),最后输出经过所给操作后的新地图。下面的描述仅为本题支持的操作,可能与实际游戏有所不同。

首先输入一张n行m列的ASCII字符矩阵表示游戏可见地图,在这道题目中,玩家所控制的角色可以移动到地图外,并且地图之外与地图之内按照一样的方式参与计算,但是程序最终只需要输出可见地图内的部分。
地图使用"."(不包括双引号,下同)表示这个位置上没有物品,使用ASCII英文小写字符(从"a"到"z")表示不同的物品(即最多有26种物品)。不可见地图的部分初始全为"."。

玩家的操作仅支持上下左右,分别使用大写字符"W"、"S"、"A"、"D"表示,可以移动全部当前操纵的物品的位置。

玩家操纵的游戏物品可能会改变,输入中使用语句"x is you"来声明玩家操纵的物品("you"即代表玩家),则玩家进行上下左右移动时操控的就是物品"x",如果玩家此时向上移动,则游戏世界内(即包括可见地图部分与不可见地图部分)所有物品"x"都会向上移动一格。此语句中"x"可填写任何表示物品的小写英文字符。

物品种类也可以改变,输入使用语句"x is y"来让所有物品"x"原地变成"y",此语句中"x"和"y"可填写任何表示物品的小写英文字符。

操作序列包含q行,每行为以下三种之一:
1. "x is you":修改当前操纵的物品(操作序列的第一行保证是这种输入)。保证游戏地图上此时存在物品"x"。并且保证q行操作的第一行一定是此类输入。
2. "x is y":将地图上所有物品"x"原地变成"y"。输入保证不会改变玩家当前正在操作的游戏物品但是可能会将其它物品变成与玩家当前操作物品同种类的物品
3. 由"W"、"A"、"S"、"D"组成的字符串:表示玩家进行了这些移动操作。操作序列中所有这种输入的字符串长度之和不超过。因为保证了被设定为"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;
}
 

上一题