pascal语言编程:最少移动次数问题(平面问题)

【问题描述】
有n×m堆糖果,排成n行、m列。已知每堆糖果有一定的颗数,且颗数之和均为n*m的倍数。移动各堆中的任意颗糖果,使每堆的数量达到相同,且移动次数最少。
移动规则:
每次可以移动任意的糖果颗数,只能水平或竖直移动,不能斜向移动,每次只能移动1格。

输入格式:第一行两个数,分别是行数n和列数m;接下来的n行输入n×m的矩阵。
【样例输入】
4 3
9 10 11
7 13 10
15 4 11
2 16 12

进一步:若允许斜向移动呢 ?
求最少的移动次数?

第1个回答  2015-08-19
n,m的范围和糖果的总数是什么样的范围呢?需要什么样复杂度的算法?追问

n、m都不超过30。糖果总数不超过32767。算法不限!运算时间不超过60秒。

追答

30*30感觉还是略大.....
没有想到什么多项式的算法,我注意到如果将最终的移动路径连起来会构成一个森林,但是仿佛还是只能搜。
估价可以用费用流来跑,答案的上限有n*m,感觉搜索应该跑不了这么大。
只想到了这么些,如果你知道怎么做了的话还请告诉我....

追问

允许斜向移动作为第一问题;不允许斜向移动作为递进的问题。也许这样更容易解决问题!

若不允许斜向移动,则发生斜向移动时,将其记录为一次水平加一次竖向移动即可解决 !

本回答被提问者采纳
相似回答