一条路劲,使其从左下角至右上角所经过的权值之和最大。
解析:在这种情况下.....
一步一步看下来。
苏牧倒也没觉得有什么难的,只不过是一些取极值的问题。
但是,当他翻到后面的经典习题和解析的时候,整个人都不好了。
【经典习题】在8×8方格的棋盘上,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。
解析:首先这是一个搜索问题,运用深度优先搜索进行求解,算法如下:
1输入初始位置坐标x,y;
2步骤c:
如果c64输出一个解,返回上一步骤c--
(x,y)←c
计算(x,y)的八个方位的子结点,选出那些可行的子结点
循环遍历所有可行子结点,步骤c++重复2
显然2是一个递归调用的过程,大致如下(c++程序解析):
#definen8
voiddfs(intx,inty,intcount)
{
inti,tx,ty;
if(countn*n)
{
output_solution();输出一个解
return;
}
for(i=0;i8;i++)
{
tx=hn[i].x;hn[]保存八个方位子结点
ty=hn[i].y;
s[tx][ty]=count;
dfs(tx,ty,count+1);递归调用
s[tx][ty]=0;
}
}
这样做是完全可行的,因为它输入的是全部解。
但是马遍历当8×8时解是非常之多,用天文数字形容也不为过,这样一来我们的求解的过程就非常慢,并且出一个解的时间也会也非常慢。
当我们在每个结点对其子结点进行选取的时候,优先选择‘出口’最小的进行搜索,‘出口’的意思是在这些子结点中它们的可行子结点的个数,也就是‘孙子’结点越少的越优先跳。
如果优先选择出口多的子结点,那出口