穿越通道

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了穿越通道相关的知识,希望对你有一定的参考价值。


描述


有个helihui建造的通道,这个通道比较奇怪,我们把通道看成平面的,里面全是数字,看例子:

 

走的时候只能一格一格的走,走的方向只能往下或往右,并且不能走出边界。从入口进来,每个格子代表通过这个格子的时间。Helihui规定最左上角是通道入口, 最右下角是通道出口,现在要求你判断从入口到出口的所有路径中总时间最小的那条路径。并输出通过该条路径的总时间,上面的红色箭头是表示这样走可以得到最小的总时间。

输入


输入数据有多组。
每组输入n,m整数,n表示通道格子的行数,m表示通道格子的列数,0<n,m<100,接下来输入n行m列的矩阵,矩阵的数据的范围0到32765。
走的时候从通道入口进入从出口出去,并且通道入口一直在最左上角,通道出口一直在最右下角。


输出


输出从入口到出口所有路径中最短时间。


样例输入

4 6
3 4 3 2 5 2
1 6 7 5 3 1
2 1 8 6 9 1
7 10 4 6 7 8

样例输出

29
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <limits.h>
using namespace std;
int s[110][110],f[110][110];
int t[2][2]=1,0,0,1;
int n,m,mi;
int dfs(int x,int y,int temp)

if(x==n&&m==y)

if(mi>temp)mi=temp;
return 0;

for(int i=0;i<2;i++)

int anx=x+t[i][0];
int any=y+t[i][1];
if(anx>=1&&anx<=n&&any>=1&&any<=m&&f[anx][any])

temp+=s[anx][any];
f[anx][any]=false;
dfs(anx,any,temp);
f[anx][any]=true;
temp-=s[anx][any];


return 0;

int main()


while(~scanf("%d %d",&n,&m))

mi=0xfffffff;
memset(f,true,sizeof(f));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&s[i][j]);
dfs(1,1,s[1][1]);
printf("%d\\n",mi);

return 0;

以上是关于穿越通道的主要内容,如果未能解决你的问题,请参考以下文章

算法分析第三章实验总结

棋盘DPOpenJudge7614最低通行费

动规(15)-最低通行费

动规(15)-最低通行费

动规(15)-最低通行费

NOI题库 / 2.6基本算法之动态规划 - 7614:最低通行费