思路: 从后像前递推,然后正向的打印路径。
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int m,n;
int mp[15][110];
int f[15][110];
void print_ans(int k,int l)
{
if(l == n)
return ;
for(int i = 1;i <= m;++i)
{
if(i == k || i == k - 1 || i == k + 1 || (k == m && i == 1) || (k == 1 && i == m))
{
if(f[k][l] - mp[k][l] == f[i][l + 1])
{
printf(" %d",i);
print_ans(i,l + 1);
break;
}
}
}
}
int main()
{
while(~scanf("%d%d",&m,&n))
{
for(int i = 1;i <= m;++i)
{
for(int j = 1;j <= n;++j)
{
scanf("%d",&mp[i][j]);
}
}
for(int i = 1;i <= m;++i)
f[i][n] = mp[i][n];
for(int i = n - 1;i >= 1;--i)
{
for(int j = 1; j <= m;++j)
{
f[j][i] = min(min(f[j - 1 ? j - 1 : m][i + 1],f[j == m ? 1 : j + 1][i + 1]),f[j][i + 1]) + mp[j][i];
}
}
int ans = f[1][1];
int k = 1;
for(int i = 1;i <= m;++i)
if(f[i][1] < ans){
ans = f[i][1];
k = i;
}
printf("%d",k);
print_ans(k,1);
printf("\n%d\n",ans);
}
}