拯救魔法少女
来源:互联网 发布:程序界面设计软件 编辑:程序博客网 时间: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':表示该点有对应的“因果”,当晓美焰到达这个点的时候就可以获得相应的“因果”。
其中:
'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); }}
- 拯救魔法少女
- 魔法少女
- 魔法少女
- 魔法少女
- 魔法少女
- nbut_1010 魔法少女 dp
- BZOJ4399: 魔法少女LJJ
- nyist 1204 魔法少女
- nyoj 1204魔法少女
- 4399: 魔法少女LJJ
- 【NOJ】[1010] 魔法少女
- nyoj 魔法少女(简单dp)
- nyoj1204 魔法少女 线性DP
- BZOJ4399: 魔法少女LJJ treap
- BZOJ 4399: 魔法少女LJJ
- 南阳OJ 1204 魔法少女
- NYOJ 1204 魔法少女 简单DP
- NYOJ1204-魔法少女(动态规划)
- Qt 显示图像图像缩略图
- SSH连接慢解决方法和调试
- SQL Sever 2005 添加约束
- php-fpm的重启/关闭
- 读取word excel 文件
- 拯救魔法少女
- 每天一个linux命令(1):ls命令
- comet4j
- SQL Server 和 MySql 语法和关键字的区别
- 利用VC制作单机版五子棋游戏
- C语言基础知识2
- 二维码的生成细节和原理
- 《Java核心技术》读书笔记(一)
- 每天一个linux命令(2):cd命令