【(C语言,回溯法,超精简)在一个n×m的方格中,m为奇数,放置有n×m个数,方格中间的下方有一人,此人可按照5个方向前进但不能越出方格,求走过的路径最大值。】

#(C语言,回溯法,超精简,)在一个n×m的方格中,m为奇数,放置有n×m个数,方格中间的下方有一人,此人可按照5个方向前进但不能越出方格,求走过的路径最大值。
【(C语言,回溯法,超精简)在一个n×m的方格中,m为奇数,放置有n×m个数,方格中间的下方有一人,此人可按照5个方向前进但不能越出方格,求走过的路径最大值。】_第1张图片如图所示。

#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]);
}

你可能感兴趣的:(c语言,算法)