飙车[nfs.pas/c/cpp]

飙车[nfs.pas/c/cpp]
[题目描述]
已知公路总长L米,一共有K个赛道,你的赛车总是和公路上其他的普通的车走相反的方向,并且所有的车每秒沿赛道行驶1m(具体看图)问题是:跑到终点最少撞多少次车?
我们简化一下模型,画一个(L+1)*K的网格,设所有的车都是点,并且每秒末都会出现在这个网格的某个顶点上.公路上其他的车都以固定的1m/s的速度自上而下行驶,而你的跑车自下而上行驶,并且每秒可以从一个点行驶到它上方左上方右上方的点(假设飘移不浪费时间,具体请看图).
我们假设,撞车不会使车损坏,不会使车减速
对于撞车的设定:当每秒末你的车和另外一辆车处在同一点上时,算撞车;你的车和另一辆车迎面开过来,算撞车.具体请看下图:
假设一开始你可以选择任意一个赛道开始比赛,要求你写一个程序,计算到达终点至少要撞多少次车.
对于上边的例子,只要开始选择第三赛道开始跑,然后一路向北,就可以不撞车而到达终点.
[输入][nfs.in]
首行两个数,L,K,表示赛道距离,以及有几个赛道.
接下来L行,每行K个字符,第i行第j个字符表示公路距终点距离为i-1的第j个赛道的初始状态:0表示该点没有车,1表示该点有车.
铭记一点:初始时你的车在第L+1行,你可以指定一个第L+1行的位置为你的车的初始位置,而第L+1行是不在输入文件里的.
[输出][nfs.out]
一个数ans,表示最少撞车次数
[样例输入1]
4 4
1000
0100
0001
0000
[样例输出1]
0
[样例输入2]
6 4
1111
1111
1111
0000
1111
0000
[样例输出2]
3
[对样例2的说明]
初始 第一秒 第二秒 第三秒
距终点0m 1111
距终点1m 1111 1111
距终点2m 1111 1111 1111
距终点3m 0000 1111 1111 1P11
距终点4m 1111 0000 P111 1111
距终点5m 0000 P111 0000 1111
距终点6m C
C代表该点只有你的车,P代表该点既有你的车又有其他的车.最优方案为第一秒直走,与一辆车相撞,第二秒直走,又与一辆车相撞,第三秒斜向右走,又与一辆车相撞,总共三次.如果第三秒直走,将与两辆车相撞,那么就撞了四次,所以三次最优.
[样例输入3]
4 4
1111
1111
1111
1111
[样例输出3]
2
[对样例3的说明]
不停地斜着走
[数据范围]1
bibee 1年前 已收到1个回答 举报

DSSW 幼苗

共回答了15个问题采纳率:93.3% 举报

啊,刚好做过,代码给你.
program nfs;
const maxn=10000;
var
i,j,k,m,n,ans:longint;ch:char;
a,f:array[0..500,0..500] of longint;
function min(x,y:longint):longint;
begin
if x1 then f[i,j]:=min(f[i,j],f[i-1,j-1]+a[i*2,j]);
if j

1年前

6
可能相似的问题
Copyright © 2024 YULUCN.COM - 雨露学习互助 - 16 q. 0.026 s. - webmaster@yulucn.com