算法设计与分析-美国地图上色
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法设计与分析课程设计》
题目
学院名称: 计算机科学与通信工程学院 专业班级: 软件 学生姓名: 忘了飞的泡泡 学生学号: 10号
指导老师: 黄如兵
2015年1月08日
JIANGSU UNIVERSITY
算法设计与分析课程设计报告
^V^声明: // 老师一再问是不是自己写的全部算法都是自己写的完全无仿照其他代码界面是自己暑假写的仿QQ界面稍作修改加以使用以下是课设期间使用的图片(7个)和逐步完善后保存以防止修改出错的备份代码文本文件(16个)
这个是暑假自己做的仿QQ界面拿来改成了程序界面
课设过程
讲讲自己怎么写的吧,
一开始肯定是思路,前期确定用二维数组来设置邻接关系(后来才知道叫邻接矩阵)在纸上用递归写出了初步的回溯法,自己做了个,五块图来验证,输出方案和方案数目,有结果了,但发现不全,因为回溯法回溯时,忘了对当前颜色置成空导致影响了回溯的结果。
更改后测试正确,然后就切换到了,美国地图,这个数目太大,矩阵做了好久,测试输出,程序一直在运行,因为要输出所有方案,出去吃了个饭回来,输出结束了。
后来改成指输出一种方案,想要哪种自己可以选择,测试成功。
用地图上色验证,出现不可行的了,觉得矩阵有问题,果不其然,多次验证都是矩阵出问题,果断重新检查矩阵,比对无误后,验证也成功了。
后来写了个界面,又加了个运算时间测试,变化州输出,和验证函数。
大体完成了。
程序评价
^V^挺满意的,毕竟自己写的很认真,各种细节考虑到了,也进行了优化,可以输出
4-50 不同颜色的方案
唯一欠缺就是第几个方案数那里没有限制(比如4种颜色,方案数取得非常非常大,可能就不存在,这是bug)
总结:
第一次尝试完全不去仿照其他代码写算法磕磕绊绊有忙到很晚的时候有早上醒来很困也想接着写的时候,老师讲的明白,自然课设比较顺利^V^
程序截图(中间输出信息省略)
一、题目与说明
1.问题描述:
美国地图着色问题
2.程序编制环境相关说明
硬件:装有windows操作系统的计算机
软件:eclipse 画图(初期验证算法正确性)
二、程序主要算法设计分析说明
算法设计思路:
回溯法(深度遍历) 后期优化进行了剪枝
可自由选择第几个方案, 选择上色颜色数量
首先使用矩阵表示各州之间的相邻关系, 一州对应一行,
从第一个开始上色,选环检测相邻州有无相同颜色,
有则颜色加一,无则进入下一个颜色上色,
全部颜色不可行回上一步
直到产生可行解
判断可行解是否符合要求
符合输出终止
不符合继续进行
流程图说明:
不给了吧回溯法都差不多^V^
三、程序模块说明
主要的全局变量:
Off //回溯法终止变量
Sum //可行方案数累加变量用于寻找多个可行方案
Console // 想要第console种方案它与sum 比对成功输出方案Ckeckk // 用于判断结果中是否含有要求的全部颜色
主要函数:(只写出了算法中的函数)
Xunhuan(); //深度遍历
Yanzheng(); //进行方案验证
Main() //前期用于调试的主程序
四、总结(含主函数设计说明)
public static void xunhuan(int x,int g){
double a=0.0;
if(off==0){
int n=x; //x为当前州
int k=g;// g为颜色数量
int f=0;
for(int t=1;t for(int tt=1;tt { if(xl[tt][0]==t) { f+=1; break; } } } for(int p=1;p if(country-n+1 break; int Q=0; //判断当前颜色是否可行变量 xl[n][0]=p; //当前州赋初值p for(int m=1;m if(xl[n][m]==1){ //如果有州与当前州相邻 if(xl[n][0]==xl[m][0]){ //判断是否颜色相同 break; //颜色相同跳出循环 } } if(m==country){ // 颜色都不同当前颜色可行 Q=1; // 当前颜色可行赋值 1 } } if(Q==1&&n==country){// 到达最后一个州有可行颜色进入筛选 判断 //用于对结果进行筛选 k种颜色都要出现在颜色数组中 for(int t=1;t ok: for(int tt=1;tt { if(xl[tt][0]==t) { checkk+=1; break; //存在t 跳出当前循环执行 t+1 } if(tt==country) { break ok; // 不存在 t 结果不合格跳出ok循环 } } } //筛选合格 checkk=k 执行输出和跳出 if(checkk==k){ sum++; //sum 对结果数进行累加 if(Console==sum){ //可以设置console 通过与sum比对来选择想要第几种方案 for(int t=1;t //System.out.println("第"+t+"块颜色 " + xl[t][0]); System.out.println(name[t]+"---" + xl[t][0]); color[t]=xl[t][0]; } System.out.println("------------"+sum+"----------------"); off=1; // 跳出判断符号 xl[n][0]=0; sum=0; // 跳出结束前将sum 恢复为0 ;方便下次执行 checkk=0;// 跳出结束前将checkk 恢复为0 ;方便下次执行 break;//跳出最大的for 循环 } checkk=0;// 结果累加但不是想要的第几种方案 } checkk=0;//当前循环没有产生合格结果将checkk 恢复为零为了下次筛选结果也可以放到前面开始使用时初始化 xl[n][0]=0; // 当前州所有颜色都运行过了要进行回溯该位置颜色必须置为空否则会对回溯产生影响 } if(Q==1&&n!=country){ // 当前州有可行颜色 xunhuan(n+1,k); // 进入下一个州深度遍历 } if(p==k){ xl[n][0]=0; //回溯前将当前州颜色置为空 } } } } 输入颜色种类数第几种方案(默认值为1 )