描述
有个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; }