算法设计与分析实验报告 频道分配问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

贵州大学计算机科学与技术学院

计算机科学与技术系上机实验报告

课程名称:算法设计与分析班级:信计101班实验日期:2013-11-25

姓名:张胜学号:1007010162 指导教师:程欣宇

实验序号:四实验成绩:

一、实验名称

回溯算法实验- 频道分配问题

二、实验目的及要求

1、使用在线测评的算法题目评分系统来测试所写代码;

2、通过直观的应用问题,加深对回溯算法的理解;

三、实验环境

任意C或C++编写调试工具,北京大学ICPC在线测评系统POJ

四、实验内容

1、登陆POJ系统,找到题号为1129的题目-频道分配;

2、阅读题目,分析出求解该问题的思路;

3、使用回溯算法,实现本题;

4、进行简单测试,完成之后提交到POJ系统。

五、算法描述及实验步骤

回溯算法原理:

回溯法是一个既带有系统性又带有跳跃性的搜索算法,用它可以系统地搜索一个问题的所有解或任一解。它在问题的解空间树中,按深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先策略搜索。

回溯法求问题的所有解时,要回溯到根,且根结点的所有子树都已经被搜索遍才结束。回溯法求问题的一个解时,只要搜索到问题的一个解就可结束。

频道分配问题描述:

当一个无线站广播覆盖一个非常大的区域时,需要使用转发器转发增强信号。然而,每个转发器使用的频道数必须仔细的选择,以使得相邻的转发器之间不会相互干扰。它们相互不干扰的条件是相邻的转发器使用不同的频道。

因为无线频谱是非常稀有的资源,因此,所给的转发器网络使用的频道数量必须最小化。你需要写一个程序读出转发器网络的描述,然后算出最小需要的频道数量。

注意:邻接关系具有对称性,如果A邻接B,则B邻接A。另外,因为转发器网络是平面的,所以通道不会交叉。

输入

输入由若干转发器网络的地图组成。每个地图的第一个行是转发器数量(1至26,用0表示输入结束)。每个转发器由字母A至Z标识,每行列出和一个转发器邻接的相邻转发器。

输出

对于每一个转发器网络地图,输出最少占用的频道数量(注意单复数)。

例子输入

2

A:

B:

4

A:BC

B:ACD

C:ABD

D:BC

4

A:BCD

B:ACD

C:ABD

D:ABC

例子输出

1 channel needed.

3 channels needed.

4 channels needed.

实验步骤:

1、建立频道分配问题的解题思路

1、建立频道分配问题的解题思路

首先构建回溯算法的基本框架,对每输入的若干转发器网络的地图(行数:lines),都对其所有可能的路径进行比较,找出相邻路径不同的组合即可。

2、构造算法框架

构造频道分配问题回溯算法如下:

①回溯算法实现

void backtrack(int x)

{

if(x == lines)

{

int get=0;

for(int i=0;i

{

if(result[i]>get)

get = result[i];

}

if(get

m = get;

return;

}

int j;

for(int i=1;i<=4;i++)

{

for(j=0;j

{

if(set[x][j]==1&&result[j]==i)

break;

}

if(j==lines){

result[x] = i;

backtrack(x+1);

}

}

}

②主函数调用实现

while(cin>>lines&&lines)

{

int step = 1;

m = 5;

memset(set,0,sizeof(set));

memset(result,0,sizeof(result));

for(int i=0;i

{

cin>>ch;

for(int j=2;ch[j]!='\0';j++)

set[i][ch[j]-'A']=1;

}

result[0] = 1;

backtrack(1);

3、分析出算法复杂度

根据该算法的调度可知,每输入一个行数,遍历整个子树需要树的深度时间,即O(N)时间,找到一个满足条件的值就跳出。

六、调试过程及实验结果

按照输入示例输入数据如下:

由此可知,调试结果与预期结论一致。

七、总结

通过对本实验的学习,我对回溯算法有了进一步的理解,在解决问题和分析问题上的能力得到了一定的锻炼。不过,在本次实验过程中,也遇到一些困难,比如,刚开始在算法逻辑上没有考虑周全,使得调试结果屡次出错,后通过同学的查找,我发现了错误并给予解决。八、附录

#include

using namespace std;

#define MAX 27

int set[MAX][MAX];

int result[MAX];

int lines;

int m;

void backtrack(int x)

{

if(x == lines)

{

int get=0;

for(int i=0;i

{

相关文档
最新文档