题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067
参考思路:根据所给矩阵,我们可以建立一个图,图的节点为石头数不为0的节点,还包括矩阵左上角对应的节点,所以节点数不超过11个,节点之间的距离为横坐标之差的绝对值加上纵坐标之差的绝对值,假设左上角的节点对应的编号为0,那么问题便转化成从第0个节点开始,遍历所有的节点,然后再返回到第0个节点的最短路径,根据我们对最短路径的了解,最短路径上的节点除了头尾节点相同外,不可能有节点编号相同的节点。由于节点数最多11个,所以可以用动态规划来求解,对于dp[i][j],i表示一个遍历状态,j表示这个遍历状态以第j个点结尾,比如dp[001101][2],表示这个遍历状态经过了第0个以及第2个、第三个节点,经过的先后顺序不用管,只需知道最后停留的节点,这里为第2个节点。
然后状态转移方程式为:dp[i][j] = min(dp[i][j], dp[i'][j']+distance(j', j) ),其中i = (i' | (1<<j')), j != j',最后答案为result = min(result, dp[(1<<n) - 1][i] + distance(i, 0),其中0<=i<n,n为节点数。
c++源码: