题目大意:
找出花费最少的路径,一个格子可以往它上一行的后一个格子,本行的后一个格子和下一行的后一个格子走。
思路:
要求字典序最小,而且花费最少,逆向可以保证字典序最小。
要保证字典序最小需要注意if顺序 因此WA了一次。
代码:
#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
int maps[11][101];
int smap[11][101];
int fath[11][101];
int main() {
int m,n;
while(~scanf("%d%d",&n,&m)) {
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
scanf("%d",&maps[i][j]);
memset(smap,0,sizeof(smap));
for(int i = m ; i >= 1; i--) {
for(int j = 1; j <= n; j++) {
smap[j][i] = maps[j][i] + smap[j][i + 1];
fath[j][i] = j;
if(j > 1 && smap[j][i] >= maps[j][i] + smap[j - 1][i + 1]){
smap[j][i] = maps[j][i] + smap[j - 1][i + 1];
fath[j][i] = j - 1;
}
if(j == n && smap[j][i] >= maps[j][i] + smap[1][i + 1]) {
smap[j][i] = maps[j][i] + smap[1][i + 1];
fath[j][i] = 1;
}
if(j < n && smap[j][i] > maps[j][i] + smap[j + 1][i + 1]) {
smap[j][i] = maps[j][i] + smap[j + 1][i + 1];
fath[j][i] = j + 1;
}if(j == 1 && smap[j][i] > maps[j][i] + smap[n][i + 1]) {
smap[j][i] = maps[j][i] + smap[n][i + 1];
fath[j][i] = n;
}
}
}
int MIN = 1;
for(int i = 2; i <= n; i++)
if(smap[MIN][1] > smap[i][1])
MIN = i;
int min = smap[MIN][1];
for(int i = 1; i <= m; i++) {
if(i < m) printf("%d ",MIN);
else printf("%d\n%d\n",MIN,min);
MIN = fath[MIN][i];
}
}
return 0;
}