#(C语言,回溯法,超精简,)在一个n×m的方格中,m为奇数,放置有n×m个数,方格中间的下方有一人,此人可按照5个方向前进但不能越出方格,求走过的路径最大值。
如图所示。
#include //靳
int value = 0;//用来存放路径的最大值
int t[6] = { 0 };//用来存放路径
int a[6][7] = {
{ 16, 4, 3, 12, 6, 0, 3 },
{ 4, -5, 6, 7, 0, 0, 2 },
{ 6, 0, -1, -2, 3, 6, 8 },
{ 5, 3, 4, 0, 0, -2, 7 },
{ -1, 7, 4, 0, 7, -5, 6 },
{ 0, -1, 3, 4, 12, 4, 7 } };
void f(int m, int n, int c, int e[]) //m:行,n:列,c:当前路径值的总和 ,e:路径
{
if (m < 0){//当递归到顶层之外就退出。
if (c > value) { //退出前判断是否是更大路径。
value = c;//保存当前最大路径的值
for (int i = 0; i < 6; ++i)//保存路径
t[i] = e[i];
} return;
}
for (int i = n - 2; i <= n + 2; ++i)//(n-2--n+2)是从第吗m,行n列展开的5个方向。
{
if (i >= 0 && i < 7)//判断保证此方向不越界
{
e[m] = a[m][i]; //保存这以方向的点
f(m - 1, i, c + a[m][i], e);//递归
}
}
}
void main()
{
int e[6] = { 0 };
f(5, 3, 0, e);
printf("%d\n",value);//打印最大值
for (int i = 5; i >= 0; --i)//打印路径
printf("%d ", t[i]);
}