数据结构:五岔路口交通灯问题

网上有很多关于这个问题的文章,但是基本都是用的贪心算法,贪心算法的思路比较简单,而且时间复杂度是多项式级别的,但是贪心算法得到的最终结果并不能保证是最优解。所以,这里我写一下关于这个问题的穷举法解法,顺便也把贪心算法的代码贴一下。

交通指挥灯问题。一个具有五条通路的交叉路口,当允许某些通路上的车辆在交叉路口通行时,必须对其他通路上的车辆加以限制,不许同时在交叉路口通行,以免发生碰撞。
问题:如何依题意建立一个可以求解不同颜色灯的数量来指挥交通的模型?

解决思路(穷举法)

这个问题是典型的图的涂色问题,即对图中每个顶点涂色,且相邻的顶点不能涂同一种颜色,求最少的颜色数

  1. 首先求通路的个数
    可以用排列组合的方法,依次固定每个岔路为入口,例如固定A为入口,则有D、C、B 3种出口,同理B和D也是3种,E有4种,这样计算出来一共是4+3*3=13种。
  2. 准备一个颜色数组int v[13] = {0}存放每个通路对应的颜色。
  3. 准备一个矩阵bool e[13][13],存储节点的边信息,其中节点代表通路,如AB,如果两个通路冲突,则在这两个节点之间连一条边,相应的在矩阵中对应位置就为1。
  4. 写一个递归函数,递归地尝试每一个顶点对应的颜色是否满足要求。例如:假如共有两种颜色,每个通路的颜色从0开始测试,第一个通路颜色肯定为0,下一个顶点也从0开始尝试,共有两种情况(0,1),每选一种颜色都要与他前面的所有通路相比较(在这里是第一个通路),如果它与前面的某个通路颜色相同且相邻,则颜色序号加1,当颜色序号等于颜色总数时,循环结束,如果所有的顶点都被上色,即尝试完所有的通路,说明找到了当前颜色数目对应的方案,输出结果,退出程序。
  5. 从颜色数目为2(不可能只有一个信号灯)开始循环,调用递归函数,每次调用颜色数目加一。

实现代码

// 交通灯穷举版本.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>using namespace std;int v[13] = { 0 };
bool e[13][13] = {{0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,1,1,1,0,0,1,1,0},{0,0,0,0,0,1,0,0,0,1,1,1,0},{0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,1,1,0,0,1,1,1},{0,1,1,0,0,0,1,0,0,0,1,1,1},{0,1,0,0,1,1,0,0,0,0,1,1,1},{0,1,0,0,1,0,0,0,0,0,0,1,1},{0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,1,0,0,0,0,0,0,0,0,0,1},{0,1,1,0,1,1,1,0,0,0,0,0,1},{0,1,1,0,1,1,1,1,0,0,0,0,1},{0,0,0,0,1,1,1,1,0,1,1,1,0}
};
//涂色函数
void dye(int cur_v, int color_num)
{//出口if (cur_v == 13){cout << "最后的亮灯方案:";for (int i = 0; i < 13; i++){cout << v[i] << " ";}cout << endl;cout << "共" << color_num << "种颜色" << endl;exit(0);}//cout << "color_num = " << color_num << ", cur_v = " << cur_v << endl;//依次测试每一种颜色for (int i = 0; i < color_num; i++){v[cur_v] = i;bool ok = true;//对cur_v之前的节点进行冲突探测for (int j = 0; j < cur_v; j++){if (v[cur_v] == v[j] && e[cur_v][j] == 1){ok = false;break;}}if (ok){//递归涂下一个顶点dye(cur_v + 1, color_num);}}
}int main()
{for (int color_num = 2; color_num <= 13; color_num++){dye(0, color_num);}
}

运算结果:0, 0, 0, 0, 1, 1, 2, 2, 0, 1, 3, 3, 0

贪心算法

贪心算法并不能保证最优解,直接贴上代码

#include <iostream>using namespace std;struct Node
{char name[8];int color;
};
void main()
{int cnt_color = 1;int i, j;Node v[13] = {{"ED",0}, {"AC",0}, {"AD",0}, {"BA",0}, {"BC",0},{"BD",0}, {"DA",0}, {"DB",0}, {"DC",0}, {"EA",0},{ "EB",0},{"EC",0},{ "AB", 0}};bool e[13][13] = {{0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,1,1,1,0,0,1,1,0},{0,0,0,0,0,1,0,0,0,1,1,1,0},{0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,1,1,0,0,1,1,1},{0,1,1,0,0,0,1,0,0,0,1,1,1},{0,1,0,0,1,1,0,0,0,0,1,1,1},{0,1,0,0,1,0,0,0,0,0,0,1,1},{0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,1,0,0,0,0,0,0,0,0,0,1},{0,1,1,0,1,1,1,0,0,0,0,0,1},{0,1,1,0,1,1,1,1,0,0,0,0,1},{0,0,0,0,1,1,1,1,0,1,1,1,0}};int result[13] = { 0 };for (i = 0; i < 13; i++){if (v[i].color == 0)//未被涂色{bool flag = true;v[i].color = cnt_color;printf("第%d种颜色节点:%5s", cnt_color,v[i].name);for (j = 1; j < 13; j++)if (e[i][j] == 0 && v[j].color == 0){for (int k = 0; k < 13; k++){if (v[k].color == v[i].color &&e[j][k] == 1)//j与和i相同颜色的点相邻{flag = false;}}if (flag){v[j].color = cnt_color;printf("%5s", v[j].name);}}cnt_color++;printf("\n");}}      printf("颜色总数: %d\n", cnt_color - 1);for (auto x : v){printf("%s\t", x.name);}printf("\n");for (auto x : v){printf("%d\t", x.color);}
}

数据结构:五岔路口交通灯问题相关推荐

  1. 数据结构:五岔路口交通管理红绿灯设计

    我们可以知道这是一个"图"的着色问题:设置交通灯的问题等价于对图的顶点染色问题,要求对图上的每一个顶点染一种颜色,并且要求有线相连的两个顶点不能用同一种颜色. 首先要考虑,为什么可 ...

  2. 计算机原理实验红绿灯转换,微机原理与应用的5个实验 包含8086扩展,8255交通灯,DEBUG程序,数码显示...

    包含8086扩展,8255交通灯,数码显示 实验一:汇编语言程序设计 实验二:查表程序设计 实验三:I/O口扩展实验 实验四:数码显示 实验五:8255模拟交通灯 实验一汇编语言程序设计实验目的 1. ...

  3. 嵌入式综合实验交通灯linux,单片机与嵌入式系统实验十五 交通灯控制

    实验十五 交通灯控制 一 . 实验目的 1.学习外部中断技术的基本使用方法. 2.进一步掌握中断处理程序的编程方法. 3.学习顺序控制的编程方法. 二 . 实验内容 本实验模拟交通信号灯控制,一般情况 ...

  4. 8255交通灯实验的微型计算机,微机原理课程设计——8255,8253交通灯模拟实验.doc...

    文档介绍: 微机原理课程设计 设计任务及要求: 交通信号灯的控制: 通过8255A并口来控制LED发光二极管的亮灭. A口控制红灯,B口控制黄灯,C口控制绿灯. 输出为0则亮,输出为1则灭. 用825 ...

  5. 微型计算机接口与技术的交通灯,微机原理及接口技术课程设计交通灯

    微机原理及接口技术课程设计交通灯 序言 十字道口的红绿灯是交通法规的无声命令,是司机和行人的行为准则.十字道 口的交通红绿灯控制是保证交通安全和道路畅通的关键.当前,国内大多数城市正在 采用" ...

  6. 微型计算机技术 论文,微型计算机技术课程设计论文报告微机交通灯控制系统_毕业论文.docx...

    * * *计算机科学系 课程设计(综合实验)报告 (2014--2015 年度第一学期) 课程名称:微型计算机技术 题 目:微机交通灯控制系统 班 级: 学 号: 学生姓名: 指导教师: 设计周数: ...

  7. 基于单片机的十字路口交通灯设计(带左转、紧急、夜间模式且每个绿灯后都有黄灯二)

    资源文件夹包含:proteus仿真+原理图:keil编写的C语言程序. 资源链接:加我QQ:1271370903 一.设计要求及内容 该控制系统中,主要由AT89C51单片机芯片.时钟电路.复位电路. ...

  8. 单片机交通灯控制系统

    一.实验目的 掌握单片机的综合应用设计. 二.实验仪器.材料 Keil软件.proteus软件 三.实验内容及要求 完成以下任务:十字路口的交通灯控制系统,四组灯对应十字路口的四个方向,用两位的数码管 ...

  9. 基于51的交通灯Proteus仿真设计

    目录 运行环境 仿真图像 特点 软件硬件实现 注意: 部分代码 交通灯逻辑处理部分代码 HC595发送代码 运行环境 keil5,proteus8.5 仿真图像 特点 这个设计相比较其他设计而言,使用 ...

最新文章

  1. Linux系统火焰图
  2. CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)
  3. java中optionnull_用 option 代替 null
  4. jQuery-处理class属性
  5. 深度学习核心技术精讲100篇(八十一)-NLP预训练模型ERNIE实战应用案例
  6. 使用 C# + SQLite + PetaPoco + django 快速打造桌面程序
  7. win10安装linux分配两个磁盘,Win10 与 Ubuntu 16.04 LTS 双硬盘双系统安装及环境配置...
  8. 2018年智能音箱对比
  9. JPA 2.1实体图–第1部分:命名实体图
  10. 前端笔记-vue cli引入sementic-ui(sementic-ui-vue)
  11. python编程常见小技巧
  12. 【MySQL 中 动态sql,游标_】
  13. php mysql搜索算法_PHP实现深度优先搜索算法(DFS,Depth First Search)详解
  14. 最通俗易懂的 Java 10 新特性讲解 | 原力计划
  15. python应用系列教程——python使用smtp协议发送邮件:html文本邮件、图片邮件、文件附件邮件
  16. windows下把SD卡格式化成NTFS格式
  17. cad填充图案乱理石_CAD实用填充图案129种下载_CAD实用填充图案129种官方下载-太平洋下载中心...
  18. win7磁盘清理_电脑磁盘已满怎么清理?磁盘清理的注意事项有哪些?
  19. adb 查看屏幕大小_Android adb获取屏幕分辨率
  20. 【计算机网络】网络层 : 子网划分 ( 三级 IP 地址 | 子网划分 | 子网掩码 | 子网掩码计算示例 | 子网的分组转发 )★

热门文章

  1. 基于JAVA模拟考试系统计算机毕业设计源码+数据库+lw文档+系统+部署
  2. 华为一、二、三面面经
  3. 已解决:Ubuntu下台式机前置面板耳机插孔没有声音
  4. 企业费控,驶向「一体化」
  5. vue2 django前后端分离(一.环境搭建)
  6. windows中新建任何后缀的文件(包括无后缀名)
  7. 业余草站长告诉你:网站被克隆了怎么办?
  8. 影院服务器linux系统怎么安装,私人家庭影院之路 - 篇一:服务器安装Rutorrent(PT盒子)Seedbox教程...
  9. 看完这一篇后我同事说我写代码像写诗
  10. 评价最高影片JAVAlibrary_三大“百亿影帝”联袂主演,一部比肩《战狼》的王炸影片即将诞生...