拯救魔法少女

来源:互联网 发布:程序界面设计软件 编辑:程序博客网 时间:2024/06/11 21:55

拯救魔法少女

Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 33   Accepted Submission(s) : 13

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

在第三次轮回中小圆用唯一的悲叹之种净化了晓美焰的灵核,并向晓美焰祈求再次回到过去,去拯救当时没有变成魔法少女的自己。晓美焰可以让时光倒流,回到某一个特定的时间点,然而时空是很复杂的,为了简单,我们可以把时空隧道想象成一个m*n的地图,由于魔力有限,最开始晓美焰只可以跳到其中某些点,然后开始向最终的时间点前进,由于有些点是有虫洞的,所以她不会到有虫洞的地方,并且她不能走到地图外,因为这样她就会失去对时空的掌控,永远也回不来了。每次晓美焰可以向上下左右四个方向前进一步,这会消耗魔力,所以晓美焰只会走最短的道路。在这个时空的某些地方,有可能会有一些“因果”,获得复杂的“因果”可能会有更强的魔力,因此,在到达终点的过程中,晓美焰想获得更多的“因果”。你被魔法少女们的故事所感动,所以想尽自己的能力帮助晓美焰,写一个程序帮助晓美焰找出最短的路径,并计算所能获得的最多的“因果”。

Input

最开始一行是两个整数n,m(1<=n,m<=50),表示地图的大小,接下来有一个n行m列的地图。
其中:
'S':代表最开始晓美焰能跳到的时空点,地图中S的数量为x,1<=x<=20。
'E':代表终点,题中保证有且仅有一个终点。
'.':代表一个时空点,晓美焰可以到达这个点。
'#':代表一个虫洞,晓美焰不能到这个点。
'0'~'9':表示该点有对应的“因果”,当晓美焰到达这个点的时候就可以获得相应的“因果”。

Output

如果晓美焰能到达终点,输出晓美焰需要走的最少步数和在过程中能获得的最大“因果”的值,这两个值中间用一个空格隔开。如果晓美焰不能到达终点,输出"impossible"。

Sample Input

4 4S..S#56#...4.E..4 4..S5####E......S4 4..S5####E.......

Sample Output

4 54 0
impossible
题解:这是一个BFS+记忆话的题目,从E点出发,然后用一个数组记录从E点到该点最短的路径情况下的最大值。
注意每次必须标记走过的点是把该步走完之后再更新。
#include <iostream>#include <cstdio>#include <algorithm>#include <stdlib.h>#include <queue>#include <memory.h>#define maxn 55using namespace std;int steph[5]={0,1,0,0,-1};int stepw[5]={0,0,1,-1,0};char map[maxn][maxn];char mapconst[maxn][maxn];int mapvalue[maxn][maxn];struct point{    int h,w,step,val;}end,change,ans;int Hight,weight;bool check(int h,int w,point now){    bool flag=0;    if(1<=h&&h<=Hight&&0<=w&&w<weight)    {        if(map[h][w]!='#')        {            change=now;            change.w=w;            change.h=h;            change.step++;            flag=1;            if('0'<=mapconst[h][w]&&mapconst[h][w]<='9')                change.val=mapvalue[now.h][now.w]+mapconst[h][w]-48;            else                change.val=mapvalue[now.h][now.w];        }    }    return flag;}point BFS(point &now){    if(map[now.h][now.w]=='S')return now;    int count=0,flag,biaoji=11111;    int a[25000][2];    flag=now.step;    queue<point>Q;    Q.push(now);    point pp;    pp.step=10000000;pp.val=0;    while(!Q.empty())    {        now=Q.front();        Q.pop();        if(now.step>=biaoji)break;        if(flag<biaoji&&flag<now.step)        {            for(int i=1;i<=count;i++) map[a[i][0]][a[i][1]]='#';            flag=now.step;            count=0;        }        for(int i=1;i<=4;i++)        {            if(check(now.h+steph[i],now.w+stepw[i],now))            {                if(map[change.h][change.w]=='S')                {                    if(biaoji>change.step)biaoji=change.step;                    pp.step=change.step;                    if(pp.val<=change.val)                    pp.val=change.val;                    continue;                }                if(mapvalue[change.h][change.w]<change.val)                mapvalue[change.h][change.w]=change.val;                if(map[change.h][change.w]!='N')                {                    a[++count][0]=change.h,a[count][1]=change.w;                    map[change.h][change.w]='N';                    Q.push(change);                }            }        }    }    return pp;}int main(){    //freopen("in.txt","r",stdin);    while(~scanf("%d%d",&Hight,&weight))    {        memset(map,0,sizeof map);        memset(mapconst,0,sizeof mapconst);        memset(mapvalue,0,sizeof mapvalue);        for(int i=1;i<=Hight;i++)        {            scanf("%s",map[i]);        }        for(int i=1;i<=Hight;i++)        {            for(int j=0;j<weight;j++)            {                mapconst[i][j]=map[i][j];                if(map[i][j]=='E')end.h=i,end.w=j,end.val=0,end.step=0;            }        }        map[end.h][end.w]='#';        ans=BFS(end);        if(ans.step==10000000)printf("impossible\n");        else printf("%d %d\n",ans.step,ans.val);    }}
原创粉丝点击