算法之挖地雷问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.考核内容
你选择的大作业。
二.具体要求
1.每个学生分别选择一个题目,可用各种算法(包括你自己的计算方法)解题。
提交每一个题目的完整的完成报告,报告内容包括:
(1)算法的由来及其应用(你为何选择这个题目,它目前研究状况,有何用处等等);
(2)算法思想(可以用流程图、自然语言或伪代码来描述);
(3)算法实现的源程序代码(代码的主要部分语句要有注释,函数要有功能说明);
4.大作业报告必须提交电子稿。封面标题如上,并附上班级,学号和姓名等。正文部分一律用五号宋体字(各级标题字体可以自行调整)。注意排版尽量做到规范美观。
5.可以参考任何资料,但杜绝抄袭。源程序代码必须通过验收(即在验收时要能够说明各行代码的作用)。
6.电子稿形式,题目.doc加上源码目录打成一个压缩包,压缩包名称:题目-姓名-短学号.rar,发给课代表(不要单独发我!),由课代表收齐后统一打包发给我。
同时我们看到在挖完1号地雷坑中的地雷之后可以选择4号地雷坑在挖完4号地雷坑之后可以选择5号坑继续挖在挖完5号坑之后可以选择6号坑继续挖在挖完6号坑之后可以选择8号坑继续挖在挖完8号坑之后可继续挖10号坑在挖完10号坑之后挖地雷结束
算法之挖地雷问题
一、问题陈述
在一条河上有若干个地雷坑,每个地雷坑中埋有一定数量的地雷,地雷坑的编号为1、2、3、…、N(N<=100),如下表所示(N=10):
任课教师:虞勤国
2012.1.5
if(h!=0)cout<<"挖地雷的路径为:"<<h;//输出查出最大地雷的路径
while(b[h][2]!=0)
{
h=b[h][2];
cout<<"--->"<<h;
}
cout<<endl;
}
五、运行结果
六、结论分析
《算法设计与分析》课程考核要求
本课程在教学计划中为考查课。考核形式采用大作业形式,以打印文档形式(每班五份)及电子稿的形式(每个人都要)验收并提交。
2、程序代码
#include<iostream.h>
#define max 100//定义最大地雷坑数
int main()
{
//初始化
int a[max]={0};//记录地雷坑地雷个数
int r[max][max]={0};//r[i][j]记录从i到j地雷坑是否走的通
int b[max][3]={0};//b[][1]记录挖出雷德总数,b[][2]记录挖出雷位置
}
b[i][1]=a[i]+cmax;//记录当前获得地雷的总数
b[i][2]=h;//记录地雷坑的位置
}
}பைடு நூலகம்
cmax=0;
h=0;
for(i=1;i<=n;i++)//找出记录中最大地雷总数
{
if(b[i][1]>cmax)
{
h=i;
cmax=b[i][1];
}
}
cout<<"挖出最多雷数为:"<<cmax<<endl;
问题为:当地雷坑中的地雷数量以及后继关系给出之后,找出一个挖地雷的方法,能挖到最多的地雷。
二、动态规划基本思想
动态规划算法通常用于求解具有某种最优性质的问题。在问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。用动态规划求解的问题,经分解得到子问题往往不是互相独立的。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。
地雷坑号
1
2
3
4
5
6
7
8
9
10
地雷数量
8
14
2
17
33
26
15
17
19
6
同时在每个地雷坑中都有一张说明书(除最后一个地雷坑以外)。说明书指出,在挖完此坑的地雷之后,还可以继续挖哪些坑。
挖地雷的规则为可以从任何一个地雷坑开始,到任何一个地雷坑结束。同时,在挖完某个地雷坑中的地雷之后,可以选择它可继续挖的地雷坑之一继续挖,但只能选择一种。
int i,j,h,cmax;
int n;
//数据输入
cout<<"请输入地雷坑的个数:";
cin>>n;
cout<<"请输入地雷坑里雷的个数:";
for(i=1;i<=n;i++)
{
cin>>a[i];
}
for(i=1;i<=n;i++)
{
for(j=i;j<=n;j++)
{
if (j==i)cout<<"请输入第"<<i<<"行,从"<<j<<"开始是否走的通:";
一般情况,若从第i个地雷坑开始挖,根据关系r,找出i后面的所有可以走通的地雷坑,从中找出一条可挖最多地雷的路线,这样可得到最多的挖地雷数。
(2)上面计算出从每个地雷坑开始能挖到最多的地雷数,此时找出一个最大值即可
2、地雷堆之间的联系可用以下的数组表示:
二维整数型数组r[i][j]表示,当r[i][j]=1表示从i到j的地雷坑可以走通,当r[i][j]=0表示从i到j的地雷坑走不通。例子中r[i][j]表示如下:
(4)(通过截图的方式)给出程序运行的结果;
(5)算法分析(对算法作一定的分析:可以从算法复杂度、优缺点或改进方法等角度来分析)。
3.每一个报告题目为“分治法(动态规划/贪心法)大作业报告”。正文中的大标题分别为:问题陈述(即题目),分治法(动态规划/贪心法)基本思想、算法描述、程序代码、运行结果、结论分析。
三、算法描述
1、用动态规划求解:
(1)由后往前查找:若从第n个地雷坑开始挖,此时可能得到a(n)枚地雷。若从第n-1个地雷坑开始挖,此时有2种可能:
①第n-1个到第n个地雷坑无法走通(可由r(n-1,n)判断),此时可挖a(n-1)枚。
②第n-1个到第n个地雷坑可以走通,则可挖a(n-1)+a(n)枚。
例如:从1坑开始,可挖到8枚地雷,挖完之后继续挖2号地雷坑,挖完之后,可挖到14枚。挖完2坑之后,还可以挖3号地雷坑,可挖到2枚。由于3号坑之后不存在链接,因此挖地雷结束。按照上面的方法,从1号地雷坑开始,到3号地雷坑结束,总共可挖到地雷数量为8+14+2=24枚。同时,我们看到在挖完1号地雷坑中的地雷之后,可以选择4号地雷坑,在挖完4号地雷坑之后可以选择5号坑继续挖,在挖完5号坑之后可以选择6号坑继续挖,在挖完6号坑之后可以选择8号坑继续挖,在挖完8号坑之后可继续挖10号坑,在挖完10号坑之后,挖地雷结束。此时总共可挖地雷数量为8+17+33+26+17+6=107。
6.提交和验收时间:2013年1月15日。
三.成绩评定
1.平时成绩占50%,大作业成绩占50%。
2.大作业评分标准如下:
1)书写格式规范(5分)
2)基本思想和算法描述(10分)
3)程序代码(15分)
4)运行结果和分析(10分)
5)教师对作品(即源代码)的验证(10分)
3.如果发现学生的大作业与已知作品相当雷同或相互有严重雷同现象,被认定为抄袭的作业,最终考试成绩一律作不及格处理。
cin>>r[i][j];
}
}
//动态规划算法开始
for(i=n;i>0;i--)//从最后一个地雷坑开始
{
cmax=0;h=0;
for(j=i;j<=n;j++)
{
if(r[i][j]==1 && b[j][1]>cmax)//找到第i到第j的坑是否走的通,并找出最大值
{
h=j;
cmax=b[j][1];
i
j
1
2
3
4
5
6
7
8
9
10
1
0
1
0
1
1
0
1
0
0
0
2
0
1
0
1
1
0
0
0
0
3
0
0
0
0
0
0
0
0
4
0
1
1
0
0
0
0
5
0
1
1
1
0
0
6
0
0
1
1
0
7
0
1
1
1
8
0
1
1
9
0
0
10
0
四、程序代码
1、程序输入
按照提示第一行输入地雷坑的个数,第二行输入地雷坑中地雷个数,之间用空格隔开。第三行按照表格输入从第i行第i个地雷坑开始到第i行最后地雷坑是否可以走通,1表示走的通,0表示走不通,之间用空格,输入完第i行回车输入i+1行数据。直到最后一行。
相关文档
最新文档