美文网首页
第八次寒假集训

第八次寒假集训

作者: 李耳_9992 | 来源:发表于2019-01-30 16:16 被阅读0次

The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius has to rescue our pretty Princess. Now he gets into feng5166's castle. The castle is a large labyrinth. To make the problem simply, we assume the labyrinth is a N*M two-dimensional array which left-top corner is (0,0) and right-bottom corner is (N-1,M-1). Ignatius enters at (0,0), and the door to feng5166's room is at (N-1,M-1), that is our target. There are some monsters in the castle, if Ignatius meet them, he has to kill them. Here is some rules:

1.Ignatius can only move in four directions(up, down, left, right), one step per second. A step is defined as follow: if current position is (x,y), after a step, Ignatius can only stand on (x-1,y), (x+1,y), (x,y-1) or (x,y+1).
2.The array is marked with some characters and numbers. We define them like this:
. : The place where Ignatius can walk on.
X : The place is a trap, Ignatius should not walk on it.
n : Here is a monster with n HP(1<=n<=9), if Ignatius walk on it, it takes him n seconds to kill the monster.

Your task is to give out the path which costs minimum seconds for Ignatius to reach target position. You may assume that the start position and the target position will never be a trap, and there will never be a monster at the start position.
Input
The input contains several test cases. Each test case starts with a line contains two numbers N and M(2<=N<=100,2<=M<=100) which indicate the size of the labyrinth. Then a N*M two-dimensional array follows, which describe the whole labyrinth. The input is terminated by the end of file. More details in the Sample Input.
Output
For each test case, you should output "God please help our poor hero." if Ignatius can't reach the target position, or you should output "It takes n seconds to reach the target position, let me show you the way."(n is the minimum seconds), and tell our hero the whole path. Output a line contains "FINISH" after each test case. If there are more than one path, any one is OK in this problem. More details in the Sample Output.
Sample Input
5 6
.XX.1.
..X.2.
2...X.
...XX.
XXXXX.
5 6
.XX.1.
..X.2.
2...X.
...XX.
XXXXX1
5 6
.XX...
..XX1.
2...X.
...XX.
XXXXX.
Sample Output
It takes 13 seconds to reach the target position, let me show you the way.
1s:(0,0)->(1,0)
2s:(1,0)->(1,1)
3s:(1,1)->(2,1)
4s:(2,1)->(2,2)
5s:(2,2)->(2,3)
6s:(2,3)->(1,3)
7s:(1,3)->(1,4)
8s:FIGHT AT (1,4)
9s:FIGHT AT (1,4)
10s:(1,4)->(1,5)
11s:(1,5)->(2,5)
12s:(2,5)->(3,5)
13s:(3,5)->(4,5)
FINISH
It takes 14 seconds to reach the target position, let me show you the way.
1s:(0,0)->(1,0)
2s:(1,0)->(1,1)
3s:(1,1)->(2,1)
4s:(2,1)->(2,2)
5s:(2,2)->(2,3)
6s:(2,3)->(1,3)
7s:(1,3)->(1,4)
8s:FIGHT AT (1,4)
9s:FIGHT AT (1,4)
10s:(1,4)->(1,5)
11s:(1,5)->(2,5)
12s:(2,5)->(3,5)
13s:(3,5)->(4,5)
14s:FIGHT AT (4,5)
FINISH
God please help our poor hero.
FINISH

公主在地图中的右下角,勇士在地图中的右上角,地图中的数字代表当前位置怪物的血量,若勇士碰上了怪物,需要消耗相应血量的时间。问勇士能否救到公主?若能,输出最短时间与路径。
迷宫题,用BFS广度搜索并记录下路径即可。

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
 
struct node{
    int x,y,step;
    node(int x0=0,int y0=0,int step0=0){
        x=x0;y=y0;step=step0;
    }
};
 
const int offx[]={1,-1,0,0};
const int offy[]={0,0,-1,1};
int n,m,step[110][110],pre[110][110];
char a[110][110];
 
void solve(){
    memset(step,-1,sizeof(step));
    memset(pre,-1,sizeof(pre));
    queue <node> q;
    q.push(node(0,0,0));
    step[0][0]=0;
    while(!q.empty()){
        node s=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int dx=s.x+offx[i],dy=s.y+offy[i],newstep;
            if(dx<0 || dx>=n || dy<0 || dy>=m) continue;
            if(a[dx][dy]=='X') continue;
            if(a[dx][dy]=='.') newstep=s.step+1;
            else newstep=s.step+1+a[dx][dy]-'0';
            if(newstep<step[dx][dy] || step[dx][dy]==-1){
                step[dx][dy]=newstep;
                pre[dx][dy]=i;
                q.push(node(dx,dy,step[dx][dy]));
            }
        }
    }
}
 
void dfs(int dx,int dy){
    if(pre[dx][dy]==-1) return;
    int sx=dx-offx[pre[dx][dy]],sy=dy-offy[pre[dx][dy]];
    dfs(sx,sy);
    printf("%ds:(%d,%d)->(%d,%d)\n",step[sx][sy]+1,sx,sy,dx,dy);
    if(a[dx][dy]!='.'){
        for(int i=1;i<=a[dx][dy]-'0';i++){
            printf("%ds:FIGHT AT (%d,%d)\n",step[sx][sy]+1+i,dx,dy);
        }
    }
}
 
void output(){
    if(step[n-1][m-1]==-1){
        printf("God please help our poor hero.\n");
    }else{
        printf("It takes %d seconds to reach the target position, let me show you the way.\n",step[n-1][m-1]);
        dfs(n-1,m-1);
    }
    printf("FINISH\n");
}
 
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=0;i<n;i++) scanf("%s",a[i]);
        solve();
        output();
    }
    return 0;
}

相关文章

  • 第八次寒假集训

    The Princess has been abducted by the BEelzebub feng5166,...

  • 寒假集训

    这次寒假集训虽然只有十天,但训练强度很大。是真的很累,每天都需要压软度,真的要哭崩了。每个技巧要重复训练...

  • 寒假集训

    寒假集训报名最晚20日之前交给我,再晚的就睡大街去吧

  • 寒假集训1

    上午早起去瑛杰武道学习交流,先了解了学生住宿情况,然后看了他们早训,陈教练带业余武术培训还是很有水...

  • 寒假集训2

    今日早起,过早后去武馆学习交流,上午因陈总教练有事外出,经协调请了陈勇教练帮忙带课,我替岗维护初级...

  • 重磅 | 硕成20考研寒假集训营一营即将震撼开营,助你金榜题名!

    寒假集训营 2019年1月15日 硕成20考研【寒假集训营】 正式开营!!! 新起点,新征程 漫漫研路,硕成相伴 ...

  • 简年3:提线木偶

    每次快到寒假集训期,我都特别焦虑。 为什么呢?因为寒假集训期特别忙。 忙的什么呢?给孩子们匹配合适的各科老师。 老...

  • 刘世界:语料数据处理与实践应用

    翻译技术寒假集训营 第五讲 人工智能时代翻译技术寒假集训营第五讲开讲啦!为大家邀请到翻译技术界的青年才俊刘世...

  • 谈寒假武术集训

    为什么要谈这个话题呢?想通过回顾来总结认识,有助于更好的做好武术教育工作。 陈教练负责学生...

  • 寒假集训营的前奏集训

    今天和小伙伴一起进行了寒假集训营的课程培训,刚开始在燕子老师的谆谆教导下,熟悉了拓普独特的问好与团建相关的流...

网友评论

      本文标题:第八次寒假集训

      本文链接:https://www.haomeiwen.com/subject/rijcsqtx.html