2011ACM大赛题目

firefox366772151 2012-04-18 09:07:36
加精
一条贪吃的蛇在一个n*m的网格中游走,它只能从一个方格走向另一个相邻的方格,这里相邻的意思是两个方格有公共边。每个方格可以看作是一个房间,其中一些是空的,一些存放有苹果。贪吃的蛇根本不进入空的房间,而进入有苹果的房间后就可以带走所有苹果使房间成为空的。蛇从一个指定的房间出发,最终回到它的家,把一路带来的苹果存储到家中,当然,它希望带来的苹果最多。请编写程序,输入有整数n和m,及n*m的一个矩阵,矩阵元素数值中有一个是 -1,表示蛇的出发位置,有一个是 -2,表示蛇的家的位置,其余数值是非负整数,0表示房间为空,非零整数表示苹果的数目。输出蛇选择的游走路径和获得的最多的苹果数目。例如输入4*4矩阵:
7 0 4 18
4 0 1 1
15 7 11 -1
0 12 -2 0
则应输出 (2, 3), (1, 3), (0, 3), (0, 2), (1, 2), (2, 2), (2, 1), (3, 1), (3, 2), 带回苹果数为1+18+4+1+11+7+12 = 54。(本题为2011年ACM大赛题目)。(可查阅:吕国英,任瑞征等编著,算法设计与分析(第2版),清华大学出版社,2009年1月,第200-202页。
提示:这是一个利用回溯算法的迷宫搜索类型问题,可参考类似问题的已有解法。
...全文
5906 70 打赏 收藏 转发到动态 举报
写回复
用AI写文章
70 条回复
切换为时间正序
请发表友善的回复…
发表回复
shun220182 2012-09-05
  • 打赏
  • 举报
回复
赚分下载东西额。。。。你懂得、、、、
cqcqcqcq555 2012-09-05
  • 打赏
  • 举报
回复
无所谓体积不体积,就是一个深搜而已。
四方向递归,记录路径和加权值,就行了。
cnmhx 2012-09-05
  • 打赏
  • 举报
回复
蛇每吃n个苹果体长增长n?
蛇每吃1个苹果体长增长1.
tmxk2013 2012-05-11
  • 打赏
  • 举报
回复
这个是动态DP吧?
fufengrui 2012-05-11
  • 打赏
  • 举报
回复
看看这个:http://blog.csdn.net/fufengrui/article/details/7543308
sjjwind 2012-05-01
  • 打赏
  • 举报
回复
貌似DP+DFS可以很好的解决,效率比单纯的回溯高不少。
tanxinga 2012-04-30
  • 打赏
  • 举报
回复
不知道你们有没有听过SPFA算法
这个算法是我每次对付图的最短路的方法

话说我觉得ACM的级别够高了
应该不会出这么简单的题目吧?
xu20101010 2012-04-29
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 的回复:]

dfs简单回溯显然复杂度会有点高了。。。
这个题其实可以看作是求一个图中2个点之间的最长路径。
-1和-2看成起点和终点,然后其余的值全部看成是边的长度,为0的话表示此路不通,
完成可以转换为一个图的模型了。。。
求2个点的最短路径有缔结斯特拉算法和floyd等,
求2个点之间的最长路径也可以用这些图论算法的变形,
然后最坏情况的复杂度就会变成多项式级别的了。。。
[/Quote]


请问(0,2)到(0,3)这条边上的值填多少 是18呢 还是4呢
wgq9158 2012-04-28
  • 打赏
  • 举报
回复
谢谢分享
zuo_xiaosi 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 的回复:]
dfs简单回溯显然复杂度会有点高了。。。
这个题其实可以看作是求一个图中2个点之间的最长路径。
-1和-2看成起点和终点,然后其余的值全部看成是边的长度,为0的话表示此路不通,
完成可以转换为一个图的模型了。。。
求2个点的最短路径有缔结斯特拉算法和floyd等,
求2个点之间的最长路径也可以用这些图论算法的变形,
然后最坏情况的复杂度就会变成多项式级别的了。。。
[/Quote]
+1
Chris_Huang 2012-04-26
  • 打赏
  • 举报
回复
谢谢你啊啊~~~~~
firefox366772151 2012-04-26
  • 打赏
  • 举报
回复
求高手大侠帮我转化成C语言的,谢谢[Quote=引用 39 楼 的回复:]

引用 36 楼 的回复:

#30楼这份数据得不到正确的结果

C/C++ code

int apple[M][N] = { 7, -1, 4, 18,
4, 0, 1, 1,
15, 7, 11, 100,
0, 12, -2, 0};


非常谢谢你的指正,改进之后可以了,漏掉了重要的一条语句:

C/C++ code
// Greed……
[/Quote]
firefox366772151 2012-04-26
  • 打赏
  • 举报
回复
求高手大侠帮我转化成C语言的,谢谢[Quote=引用 37 楼 的回复:]

用JavaScript做了个,可以自定义行,列再填数据。
HTML code

<!doctype html><html><head><title>贪吃蛇</title>
<style type='text/css'>
html, body, *{ font-family:"微软雅黑", "宋体"; font-size:13px;}
input{ width:60px; }
#map{ ma……
[/Quote]
Asylum 2012-04-26
  • 打赏
  • 举报
回复
谢谢分享。支持
paniclp 2012-04-26
  • 打赏
  • 举报
回复
39楼代码很漂亮,只是有点不大明白的,本来如果我写的话,会将square拷贝成4份,然后每个函数传入一份引用,
而作者后面修改成恢复一下数据就可以了。
其实还不是很理解,
这个递归执行过程是什么样子的?
zrmzhang 2012-04-26
  • 打赏
  • 举报
回复
按照提示的做就可以了, 利用回朔遍历所有路径.
yl_1993 2012-04-26
  • 打赏
  • 举报
回复
谢谢分享
lociation 2012-04-25
  • 打赏
  • 举报
回复
学习了,谢谢
cdsnfresh 2012-04-25
  • 打赏
  • 举报
回复
话说看不懂代码还搞毛的ACM
2012-04-24
  • 打赏
  • 举报
回复
用JavaScript做了个,可以自定义行,列再填数据。

<!doctype html><html><head><title>贪吃蛇</title>
<style type='text/css'>
html, body, *{ font-family:"微软雅黑", "宋体"; font-size:13px;}
input{ width:60px; }
#map{ margin-top:20px;}
#map table caption{ line-height:30px; height:30px; text-align:center; font-weight:bold; }
#map table{ border-collapse:collapse; border:1px solid #069; }
#map table td {border:1px solid #069; width:30px; height:30px; }
#map table .sel {background:#069; color:#fff; }
#map table td div{ line-height:30px; text-align:center;}
</style>
<script type="text/javascript">
var dft = [ [7, 0, 4,18],
[4, 0, 1, 1],
[15,7,11,-1],
[0,12,-2, 0]];
var row, col, data, start, end, delay = 100;
function $(id){
return document.getElementById(id);
}
function create(){
row = parseInt($("row").value);
col = parseInt($("col").value);
var html = ["<h3></h3><table cellpadding='0' cellspacing='0' border='1'><caption></caption>"];
html.push( new Array(row+1).join("<tr>" + new Array(col+1).join("<td><div contenteditable='true'></div></td>") + "</tr>") )
html.push("</table>");
$("map").innerHTML = html.join("");
if(row == 4 && col == 4){
var div = $("map").getElementsByTagName("div");
for(var i = 0; i < div.length; i++){
div[i].innerHTML = dft[parseInt(i/4)][i%4];
}
}
}
function getData(){
var div = $("map").getElementsByTagName("div");
table = $("map").getElementsByTagName("table")[0];
data = [], start = [], end = [];
for(var i = 0; i < row; i++){
data[i] = [];
for(var j = 0; j < col; j++){
data[i][j] = {value: parseInt(div[i*col+j].innerHTML), flag: 0};
if(data[i][j].value == -1) start = [i, j];
if(data[i][j].value == -2) end = [i, j];
}
}
if(start.length == 0 || end.length == 0){
alert("未设置起点或终点!"); return false;
}
return true;
}
function search(){
if(!getData()) return;
var result = [], max = 0, len = 0, path = [];
(function snake(i, j){
//检测是否结束
if(data[i][j].value == -2){
if(len > max){
max = len;
for(var n = 0; n < path.length; n++){
result[n] = path[n].slice(0);
}
result.push([i, j]);
}
}else{
path.push([i, j]);
data[i][j].flag = 1;
if(data[i][j].value > 0){
len += data[i][j].value;
}
if(i > 0 && data[i-1][j].value != 0 && data[i-1][j].flag == 0){ //上
snake(i-1, j);
}
if(i + 1 < row && data[i+1][j].value != 0 && data[i+1][j].flag == 0){ //下
snake(i+1, j);
}
if(j > 0 && data[i][j-1].value != 0 && data[i][j-1].flag == 0){ //左
snake(i, j-1);
}
if(j + 1 < col && data[i][j+1].value != 0 && data[i][j+1].flag == 0){ //右
snake(i, j+1);
}
data[i][j].flag = 0;
path.pop();
if(data[i][j].value > 0){
len -= data[i][j].value;
}
}
})(start[0], start[1]);
table.getElementsByTagName("caption")[0].innerHTML = max;
(function show(i){
table.rows[result[i][0]].cells[result[i][1]].className = "sel";
if(i + 1 < result.length){
setTimeout(function(){ show(i+1) }, delay);
}
})(0);
}
</script></head><body>
行:<input type="text" value='4' id="row" /> 列:<input type="text" value='4' id="col" />
<input type="button" value="建图" onclick="create()" /> <input type="button" value="搜索" onclick="search()" />
<div id="map"></div>
</body></html>

加载更多回复(31)

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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