题目描述:
Viewsetting又看了一部哈利波特系列电影:Harry Potter and the Prisoner of Azkaban(哈利·波特与阿兹卡班的囚徒)。电影里出现了一个魔法道具:活点地图。乍看之下,这张地图只是一张空白的羊皮纸;但是当使用者说出“我庄严宣誓我没干好事”(“我庄严宣誓我不怀好意”I solemnly swear that I am up to no good) ,墨线就会开始延伸,浮现出一张霍格沃茨的地图(包括秘密通道)。地图上有霍格沃茨里每个人所在的位置,并指示打开秘密通道的方法。使用完毕之后,只要说“恶作剧完毕”(Mischief managed),就可以将地图复原成空白的状态,以防止其他不知道地图口令的人使用。活点地图是莱姆斯·卢平、小矮星彼得、小天狼星布莱克以及詹姆·波特(哈利的爸爸)共同发明的,专门用来达成恶作剧。他们在就寝时间后,常常化身为动物四处探险,使得他们对霍格沃茨的地下通道有很多了解(布莱克,小矮星和波特是阿尼马格斯,而卢平是狼人。)他们将所发现的秘密通道,制作成活点地图。地图上写著这几位创造者的名字,他们采用仅限彼此所知的昵称(代表他们幻化成的动物):月亮脸(指身为狼人的卢平),虫尾巴(指小矮星,化身成老鼠),大脚板(布莱克,化身成狗),以及尖头叉子(波特,化身为雄鹿)。而这也是活点地图标题的由来。
哈利波特用这张地图可以说是开了外挂,游戏体验++,然而斯内普发现了哈利有这张地图,并且试图找出其中的秘密,但却被地图羞辱了一顿。卢平教授表示他会调查,就将地图带走了。可是现在哈利波特特别需要这张地图,于是他找到了你,帮他完成这个魔法地图。但是你只是一个麻瓜(不会膜法的普通人类),那里会这些骚操作?但是你可是会计算机的大手子啊!你就拥有那些魔法师眼中的“黑魔法”!请你编写一个程序,同样也能实现这个地图的功能。
输入:
多组输入,以EOF结束 每组第一行输入一个n(n<=999),代表记录中有n个魔法师。接下来n行,每行依次输入魔法师的名字,起始坐标和编号。其中坐标(x,y)意义是x坐标代表东西方向,x正方向为东。类似的,y是北正南负且坐标都是整数有序对。编号是三位的,如有前导零则要补足,编号不超过999。 接下来输入一个正整数k。然后接下来k行对应这地图的记录,如果这个魔法师移动了,依次输入其编号,方向(N为北,S为南,W为西,E为东),步数(正整数)。如果这个魔法师没有移动,格式是编号和”stay”。
输出:
和输入格式一样,按照序号从小到大的顺序换行输出魔法师的名字,当前坐标和编号。
样例输入
5
Harry (1,1) 231
Hermione (2,2) 402
Ron (1,0) 311
Dumbledore (10,10) 000
Snape (-1,-1) 007
3
231 E 1
402 S 1
007 stay
样例输出
Dumbledore (10,10) 000
Snape (-1,-1) 007
Harry (2,1) 231
Ron (1,0) 311
Hermione (2,1) 402
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
struct node//建立结构体存储每个人的姓名位置编号
{
char name[100];
int x,y;
int num;
};
bool cmp(node a,node b)//排序以编号从小到大排列
{
return a.num<b.num;
}
int main()
{
int n;
struct node p[1000+5];
while(scanf("%d",&n)!=EOF)
{
memset(p,0,sizeof(p));
for(int i=1; i<=n; i++)
{
//暴力输入
scanf("%s",&p[i].name);
getchar();//读空格
getchar();//读括号
scanf("%d",&p[i].x);
getchar();读','
scanf("%d",&p[i].y);
getchar();//括号
getchar();//空格
scanf("%03d",&p[i].num);
}
int k;
scanf("%d",&k);
int tmp_num;
char dir[4];
int step;
for(int ii=0; ii<k; ii++)
{
scanf("%03d",&tmp_num);
cin>>dir;
if(dir[0]!='s')
{
scanf("%d",&step);
}
bool flag=false;
//int tmp=0;
for(int i=1; i<=n; i++)
{
if(tmp_num==p[i].num)
{
if(dir[0]=='W')
{
p[i].x-=step;
}
else if(dir[0]=='E')
{
p[i].x+=step;
}
else if(dir[0]=='N')
{
p[i].y+=step;
}
else if(dir[0]=='S')
{
p[i].y-=step;
}
}
else
{
continue;
}
}
}
sort(p+1,p+1+n,cmp);
for(int i=1; i<=n; i++)
{
printf("%s (%d,%d) %03d",p[i].name,p[i].x,p[i].y,p[i].num);
//cout<<"("<<p[i].x<<","<<p[i].y<<")"<<" ";
//printf("%03d",p[i].num);
cout<<endl;
}
}
return 0;
}
//感觉是卡输入的问题emmm 用了麻烦的方法输入