两个编程题

davidstack 2009-10-18 06:04:24
1 在一m*n格的棋盘上,有的格子有水、是湿的,有的没水、是干的;有一个用海绵制作的棋子,在棋盘上可以向上、下、左、右移动到相邻的格子里,可以是湿的或干的格子;这个棋子每次经过湿的格子,都会吸收固定数量的水。用一个两维数组来表示这个棋盘,值为1表示格子有水,为0表示没有水。现在,要将该棋子从左上角移动到右下角;请编程找出通行线路,使得此海绵棋子吸水最少。(编程语言不限)
2 一超市有A、B两个分店,每个分店有个数不等的货柜,每个货柜有种类不等的蔬菜,每种蔬菜有不同的数量,每个货柜和蔬菜有不同的名称(但是A、B两分店的货柜和蔬菜的名称可能有重复的)。现在A、B两个分店合并,相同的货柜合在一起,相同的蔬菜合在一起,得到合并后的数量。
用链表来描述分店的不同货柜,按货柜名称的字母升序排列,每个货柜的蔬菜也用链表来描述,按蔬菜名称的字母升序排列,请用C语言编写一个函数,实现两个分店的合并。


高手提示一下算法
...全文
386 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
morilasi 2009-10-20
  • 打赏
  • 举报
回复
而且8楼你替换是影响题意的吧。
morilasi 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 butwang 的回复:]
1 1 0 1            1
0 0 1 0 ==>>      0 1
0 1 0 1          0 0 0
                * 1 1 1
              * * 0 0 *
              * * * 1 * *
把所有*替换成0,不影响题意
1 1 0 1            1
0 0 1 0 ==>>      0 1
0 1 0 1          0 0 0
                0 1 1 1
              0 0 0 0 0
              0 0 0 1 0 0
[/Quote]你这个跟楼主的显然不一样。。楼主的棋子可以随便走
我的思路跟whg01一样,把相邻的干格子抽象成一个点,然后计算各点之间的距离,再求一个最短路径就好了
butwang 2009-10-20
  • 打赏
  • 举报
回复
1 1 0 1 1
0 0 1 0 ==>> 0 1
0 1 0 1 0 0 0
* 1 1 1
* * 0 0 *
* * * 1 * *
把所有*替换成0,不影响题意
1 1 0 1 1
0 0 1 0 ==>> 0 1
0 1 0 1 0 0 0
0 1 1 1
0 0 0 0 0
0 0 0 1 0 0
butwang 2009-10-20
  • 打赏
  • 举报
回复
第一题,建好模型就好求解了,这题稍稍转换就成了我们熟悉的“数塔”问题
拿下面迷宫举例,
1 1 0 1 1
0 0 1 0 ==>> 0 1
0 1 0 1 0 0 0
* 1 1 1
* * 0 0 *
* * * 1 * *
把所有*替换成0,不影响题意
1 1 0 1 1
0 0 1 0 ==>> 0 1
0 1 0 1 0 0 0
0 1 1 1
0 0 0 0 0
0 0 0 1 0 0
从塔底向上数(参考,搜索"数塔"),题目要求的是最小值,就这样解决了
yangjianghua 2009-10-20
  • 打赏
  • 举报
回复
用动态规划
dp[i][j]=min(dp[i-1][j]+a[i][j],dp[i][j-1]+a[i][j])
butwang 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 morilasi 的回复:]
引用 8 楼 butwang 的回复:
1 1 0 1            1
0 0 1 0 ==>>      0 1
0 1 0 1          0 0 0
                * 1 1 1
               * * 0 0 *
              * * * 1 * *
把所有*替换成0,不影响题意
1 1 0 1            1
0 0 1 0 ==>>      0 1
0 1 0 1          0 0 0
                0 1 1 1
               0 0 0 0 0
              0 0 0 1 0 0
你这个跟楼主的显然不一样。。楼主的棋子可以随便走
我的思路跟whg01一样,把相邻的干格子抽象成一个点,然后计算各点之间的距离,再求一个最短路径就好了
[/Quote]
是有些问题,最少距离可能通过增加的那些点虚点,将×看成无穷大应该可以解决问题,
只要第n层n-1层最优
jenglev 2009-10-20
  • 打赏
  • 举报
回复
Mark
yangjianghua 2009-10-20
  • 打赏
  • 举报
回复
mark!
Heaven_cs 2009-10-20
  • 打赏
  • 举报
回复
来支持一下~
whg01 2009-10-18
  • 打赏
  • 举报
回复
问题2:
假设相同是指名称一样。
如果蔬菜的合并只是在相同的货柜范围之内,则很简单:
将代表2个店的货柜的链表,合并(相当于归并排序)。因为货柜和蔬菜已经是排好序的。
合并货柜前,先将代表货柜内2组蔬菜的链表,合并(相当于归并排序)。

如果蔬菜的合并要跨货柜:
1. 代表蔬菜的链表必须是双向链表。
2. 每个蔬菜的节点要有个指针指向其所在的货柜。假设节点为类型P。
先将代表2个店的货柜的链表,合并。
统计合并后的蔬菜节点数量n,建立P* pNode[n];并指向相应的节点。
对pNode进行快速排序。
从头到为扫描pNode,如果相邻的蔬菜节点相同,则将数量累计到前面的节点,把后面的节点删除。
如果要删除的节点是货柜的第一个蔬菜,则需要更新货柜信息。


whg01 2009-10-18
  • 打赏
  • 举报
回复
问题1. 有水的格子会将无水的格子分隔成多个干区域,有水的格子形成湿区域。
每个干区域内,不管怎么移动都不会吸水。问题转化为,如何从起点干区域走到终点所在干区域,使海绵棋子吸水最少。把干区域看作一个节点,就是一个最短路径问题。
解析干区域分隔很简单,比较麻烦的是分析出干区域相邻及相邻干区域的最短路径。
解析干、湿区域分隔。干湿区域分别编号。非递归:
每个干区域一个编号,将用二维数组记录棋盘上每个格子所在干区域的编号。从[0,0]逐个扫描到[m-1,n-1],先行后列或先列后行都行。判断当前格子的左侧和上侧的格子即可获取区域编号。如果当前点是边缘点(即与湿点相邻),记录下来。

分析区域相邻,及区域之间的短路径(要找到2个区域中距离最近的一对格子):
扫描每个湿格子的上下左右4个直线方向,直到遇到边界或干格子。遇到多少个干格子,就是遇到了多少个区域。这些干格子两两组合,计算路径通过当前湿格子的距离(路径为“—”或“L”型的旋转)。从而能得到任意相邻2个区域间的最短距离。
2个干格子的最短距离,必定是“—”或“L”型的旋转,其它形状必定不会小于这2种。
这个过程可以优化,相邻的湿格子的结果可以利用。
欢迎大家指正。
jixingzhong 2009-10-18
  • 打赏
  • 举报
回复
可以看看回溯算法相关的知识点
jixingzhong 2009-10-18
  • 打赏
  • 举报
回复
参考骑士遍历的算法,只不过走法不同,增加对吸水量的累计即可
thy38 2009-10-18
  • 打赏
  • 举报
回复
问题1用回溯
问题2没什么啊,相同的蔬菜就合并相加,不同的就找相应的地方插入,都是基本的链表操作
昵称很不好取 2009-10-18
  • 打赏
  • 举报
回复
问题1请楼主参考迷宫问题,网上都的是,搜一下;
问题2我觉得可以多用几个结构体,然后判断相同就连接,不相同就重新建立一个结构体已达到实现合并

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧