NEUQOJ 1869: Harry Potter and the Prisoner of Azkaban

本文介绍了一个基于《哈利·波特》系列中活点地图概念的程序设计挑战。该程序接收一系列输入,包括多名魔法师的位置及其移动指令,最终输出所有魔法师的新位置。此程序运用了C++的数据结构和算法来实现。

题目描述:

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 用了麻烦的方法输入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值