利比亚行动
来源:互联网 发布:淘宝显示历史价格 编辑:程序博客网 时间:2024/05/02 02:40
题目描述
2011年3月16日以来,利比亚爆发的骚乱不断升级,已严重危及到普通民众和各国在利比亚工作的人员的安全。为了尽快救出在利比亚的同胞,根据利比亚的形势,我国政府告诉每个在利比亚的公民,如何行动才能最快地到达安全的地方,然后由我国派出的飞机、轮船、汽车接回国。
假设将利比亚的地图划分为一个n行m列的长方形,待拯救的同胞小A在1行1列处,安全的目标位置在n行m列处。
利比亚是一个多沙漠的国家,经过某些位置需要消耗一定数量的食品,某些位置存储有很多很多食品。假定小A现在在位置i行j列,如果身上带有足够在新位置处需要消耗的食品的话,小A的下一个位置将到达i-1行j列、i+1行j列、i行j-1列、i行j+1列这四个位置之一,如果新位置处有食品的话,小A最多能拿一份该位置处的食品。当然如果小A已有的食品加上新位置处的一份食品数量超过小A能带食品的最高上限,小A就不能拿该位置处的食品了。
如果身上的食品不够到下一位置处的消耗,小A就不能到下一位置去,否则会面临生命危险的。当然,小A可以数次经过同一个位置,每次到此位置,都需要先消耗食品,然后可以拿一份食品(如果有的话),也就是小A可以多次到同一个地方来攒食品,也可以多次到同一个地方来消耗食品。若一个位置既要消耗食品,又可以拿食品,则小A必须先消耗食品,然后才能拿一份食品。
给出利比亚的地图,请告诉小A如何最快地从起点(1,1)走到终点(n,m)。程序只要输出最短路径长度就可以了。
输入
输入文件libyan.in的第一行有4个正整数n,m,t,maxc(1≤n≤200,1≤m≤200,0≤t≤maxc≤270),它们之间以一个空格分隔。表示利比亚的地形可以分为n行m列,小A一开始时的食品数量为t,身上最多能带maxc的食品。
接下来n行,每行m个字符,分别表示地图中该位置的信息。其中:
字符“*”表示这个位置是建筑物、河流、有地雷等人无法走到的位置(保证起点终点不是“*”);
数字字符“1”~“9”表示这个位置有该数量的食品;
小数点“.”表示人可以走到该位置,但该位置没有食品。
第n+2行只有一个正整数k,表示到达这k个位置会消耗食品。接下来k行,每行三个正整数x,y,w,表示每次到第x行y列处会消耗数量为w的食品。数据保证同一个位置不会出现两次。
输出
输出文件libyan.out只有一行,该行只有一个正整数。表示小A从起点到终点,在保证自身安全情况下走过的最短路径长度。
样例输入
【样例输入1】
3 5 0 0
.*…
…*.
...
0
【样例输入2】
4 5 2 5
..*.1
1.*..
*.1..
….1
4
1 2 2
3 2 1
4 2 3
4 3 3
样例输出
【样例输出1】
8
【样例输出2】
7
数据范围限制
70%的数据中,没有需要消耗食品的地方和存储有食品的地方。即在这些70%的数据中,输入的t=0,maxc=0,k=0,n行m列输入的地图只有小数点和*二种字符。
在上述70%的数据中,其中有40%的数据n,m均不超过100。
TJ
比赛时想到的是记忆化深搜,发现七十分之后的点全对不了。后来经过某神犇指点,学到了一个叫记忆化宽搜的东西,完美解决了这道题目。
BC
uses math;const c:array[1..4,1..2]of longint=((-1,0),(0,1),(1,0),(0,-1));var a:array[0..201,0..201]of char; takeout,hf:array[0..201,0..201]of longint; f:array[0..201,0..201,0..271]of longint; dl:array[0..10000001,1..4]of longint; n,m,i,j,k,x,y,sum,t,x1:longint; s:string;begin assign(input,'libyan.in');reset(input); assign(output,'libyan.out');rewrite(output); readln(n,m,x,t); for i:=1 to n do begin readln(s); for j:=1 to m do if s[j] in ['0'..'9'] then begin a[i,j]:='.'; val(s[j],takeout[i,j]); end else a[i,j]:=s[j]; end; readln(k); for i:=1 to k do begin readln(x1,y,sum); hf[x1,y]:=sum; end; dl[1,1]:=1; dl[1,2]:=1; dl[1,3]:=x; dl[1,4]:=0; i:=0; j:=1; while i<j do begin inc(i); for k:=1 to 4 do if (dl[i,1]+c[k,1]>0)and(dl[i,1]+c[k,1]<=n)and(dl[i,2]+c[k,2]>0)and(dl[i,2]+c[k,2]<=m)and(a[dl[i,1]+c[k,1],dl[i,2]+c[k,2]]<>'*') then begin x1:=dl[i,1]+c[k,1]; y:=dl[i,2]+c[k,2]; if dl[i,3]>=hf[x1,y] then begin sum:=min(dl[i,3]+takeout[x1,y]-hf[x1,y],t); if (f[x1,y,sum]=0)or(f[x1,y,sum]>dl[i,4]+1) then begin inc(j); f[x1,y,sum]:=dl[i,4]+1; dl[j,1]:=x1; dl[j,2]:=y; dl[j,3]:=sum; dl[j,4]:=dl[i,4]+1; if (x1=n)and(y=m) then begin writeln(dl[j,4]); halt; end; end; end; end; end; close(input);close(output);end.
- 利比亚行动
- 利比亚行动
- 利比亚行动
- 利比亚行动
- 利比亚内战始末大事记
- 行动
- 行动
- 行动
- 行动
- 行动
- 卡扎菲治下利比亚人的福利
- 华为、中兴赢得利比亚7500万美元手机合同
- 利比亚卡扎菲私人助理的女儿的求助邮件骗局
- 康和富利比亚迪店 购车送大礼包
- 付诸行动
- 行动篇
- 开始行动
- 开始行动!
- Flatten Binary Tree to Linked List问题及解法
- List更新20171024
- Ruijie—Telnet控制交换机
- HPUoj 1415: 小ho的01串 [字符串]
- ffmpeg + nginx + rtmp 搭建本地直播服务器
- 利比亚行动
- Populating Next Right Pointers in Each Node问题及解法
- SSL P2574 Closest
- 【usaco】learning
- could not read data from '/Users/xxxx/xxxx/Info.plist': The file “Info.plist” couldn’t be opened
- bzoj 2820 莫比乌斯反演
- 逻辑卷管理pv,vg,lv
- 开发人员必知的5种开源框架
- mysql外键的优缺点和使用