回溯问题一:地图涂色,四色定理证明
**题意:**使用四种颜色对N块区域涂色,输出所有涂色方案
**解题思想:**使用图的遍历来做,每块区域抽象为图顶点,四种颜色,回溯遍历涂色
**回溯概念:**回溯与递归联系十分紧密,递归的过程包括正向递归调用以及反向回退,一般我们使用递归大多数情况下正向递归调用即可解决,而回溯是指,除了正向递归调用,在回退时候我们也要处理,一般这个处理就是对正向递归调用的“恢复”,具体问题还是以具体问题去理解
C代码如下(使用文件读取数据,文件见文末):
#include <stdio.h>
#include<stdlib.h>
#define DEBUG
#define MAXVEX 100 //最大顶点数
int count=0;
typedef struct ArcNode//边表结点
{int adjvex;//邻接点域,存储该顶点对应的下标int weight;//用于存储权值,对于非网图可以不需要struct ArcNode *nextarc; //链域,指向下一个邻接点
} ArcNode;
typedef struct VNode//顶点表结点
{int data;//顶点域,存储顶点信息ArcNode *firstarc;//边表头指针int color;
} VNode, AdjList[MAXVEX];
typedef struct
{AdjList adjList;int numNodes, numEdges; // 图中当前顶点数和边数
} GraphAdjList;
void CreateALGraph(GraphAdjList *Gp)
{int i, j, k;ArcNode *pe;FILE *fp;fp=fopen("1.txt","r");fscanf(fp,"%d %d",&Gp->numNodes,&Gp->numEdges);printf("顶点数与边数:%d %d\n",Gp->numNodes,Gp->numEdges);for (i = 0 ; i < Gp->numNodes; i++){Gp->adjList[i].firstarc = NULL;//将边表置为空表Gp->adjList[i].color=0;}for (k = 0; k < Gp->numEdges; k++)//建立边表{fscanf(fp,"%d %d",&i,&j);printf("已初始化输入边(%d,%d)\n",i,j);pe = (ArcNode*)malloc(sizeof(ArcNode));pe->adjvex = j;//邻接序号为j
//将pe的指针指向当前顶点上指向的结点pe->nextarc =Gp->adjList[i].firstarc;Gp->adjList[i].firstarc = pe;//将当前顶点的指针指向pepe = (ArcNode*)malloc(sizeof(ArcNode));pe->adjvex = i;pe->nextarc =Gp->adjList[j].firstarc;Gp->adjList[j].firstarc = pe;}
}
int cheak(GraphAdjList *G,int step)///看看相邻顶点是否有重复的,有就不能要这个颜色
{ArcNode *p=G->adjList[step].firstarc;while(p!=NULL){if(G->adjList[p->adjvex].color==G->adjList[step].color){return 0;}p=p->nextarc;}return 1;
}void f(GraphAdjList *G,int step)
{if(step==G->numNodes)///点遍历完了那么就要输出{int i;printf("一组符合的:\n");for(i=0; i<G->numNodes; i++){printf("%d点涂:%d ",i,G->adjList[i].color);printf("\n");}count++;printf("\n");}else{int i=0;for(i=1; i<=4; i++){G->adjList[step].color=i;if(cheak(G,step))///看看相邻顶点是否有重复的,有就不能要这个颜色{f(G,step+1);}G->adjList[step].color=0;//更新回来}}}int main()
{GraphAdjList G;CreateALGraph(&G);f(&G,0);printf("\n\n%d ",count);return 0;
}
///所使用文件,第一行为顶点数、边数,之后为对应边
4 4
0 1
0 3
1 2
2 3
正确答案!
回溯问题一:地图涂色,四色定理证明相关推荐
- 算法设计与分析 实验三 回溯法求解地图填色问题
回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...
- 回溯法求地图填色实验(剪枝)
回溯法求地图填色(剪枝) 文章目录 回溯法求地图填色(剪枝) (一) 问题求解 思维风暴(之前瞎想的,可以跳过) (二)算法思想:回溯 伪代码: 时间复杂度分析: (三)剪枝方向 1. 下层节点选取 ...
- java 地图四色着色算法_趣味地图系列之6 四色定理之我见
四色定理(four color map theorem)是一个著名的数学定理[1],即对任意的(平面上的)地图染色,要求相邻的国家颜色不同,四种颜色即可完成着色. 南非数学家法兰西斯·古德里在1852 ...
- 如何用Tableau绘制涂色地图
做数据分析的地域分析时,用地图的方式呈现出来更为直观一些,下面记录用Tableau10.5的地图功能做一个涂色的地图. 新建数据源连接要绘制地图的源数据表格 数据源导入后点击右下角的转到工作表 左侧列 ...
- 四色地图理论的图论证明
四色地图理论的图论证明 四色地图理论我就不多说了,四色猜想与哥德巴赫猜想.费马定理成为了近代三大数学难题. 首先,大家看一个的图,平面中圆点标号1,2,3,4. 两两之间有连线.将平面切分为四个区域a ...
- 地图四色着图的C语言实现
四色问题又称四色猜想.四色定理,是世界三大数学猜想之一.四色定理是一个著名的数学定理,通俗的说法是:每个平面地图都可以只用四种颜色来染色,而且没有两个邻接的区域颜色相同.1976年借助电子计算机证明了 ...
- c语言电子地图程序,地图四色着图的C语言实现
四色问题又称四色猜想.四色定理,是世界三大数学猜想之一.四色定理是一个著名的数学定理,通俗的说法是:每个平面地图都可以只用四种颜色来染色,而且没有两个邻接的区域颜色相同.1976年借助电子计算机证明了 ...
- Python实现地图四色原理的遗传算法(GA)着色实现
1 任务需求 首先,我们来明确一下本文所需实现的需求. 现有一个由多个小图斑组成的矢量图层,如下图所示:我们需要找到一种由4种颜色组成的配色方案,对该矢量图层各图斑进行着色,使得各相邻小图斑间 ...
- 橡皮擦的英语_从填字涂鸦到英语启蒙,家长口中的儿童版“秘密花园”涂色游戏测评【玩具测评】...
#前情提要#丰富的拓展玩法让简单的穿珠游戏大不同,点击<手眼协调与数学启蒙,用线绳穿珠游戏促进能力发展>了解详情. 今天我们为大家带来了一篇绘画+英语启蒙学习玩具的测评报告.这款玩具是植绒 ...
最新文章
- java+c#+json+时间_C#与Json时间的转换
- bootstrap 横铺 行_Bootstrap 排版
- ie系列浏览器_2020下半年河北教师资格准考证打印只能用ie浏览器吗
- java logfaction_Java8 下 重构log
- 华为证实 P40 将没有 Google 服务;李世石退役;Python 3.8.1 发布 | 极客头条
- httpclient java 异步_Java的异步HttpClient
- cube一站式云原生机器学习平台-推理服务的工程化加速
- 3ds max制作宋惠乔的教程----作者: 火星时代 来源: 火星时代
- Modem2G/3G/4G/5G:高通平台SUPL配置方法总结
- ios常用第三方总结
- Realtek 1296 (RTD1296) OpenWRT Android 双系统全功能开发板
- [Swift]修改NSLayoutConstraint的multiplier
- Linux系统编程 | 01 -文件操作
- linux编辑状态a,linux 操作
- 创新思维对计算机专业的关系,创新思维复习题
- 用python输出沙漏_sandglass(沙漏)——一个让人解脱的python时间处理库
- fatal: unable to access 或者 fatal: could not read from remote repository
- np.array与np.ndarray的区别
- vSphere(一) 标准交换机和分布式交换机
- Web面试题汇总-自用
热门文章
- 建模simulink - xpc自定义模块库
- Ubuntu18.04安装Pycharm并将其添加至左侧收藏夹
- Vscode配置Vue插件Vetur自动补全和Eslint校验,正在保存“index.vue”: 从 “‘ESLint‘, ‘Vetur‘“ (configure)中获取代码操作
- 英语口语学习文章分享
- 关于win10基础上安装ubuntu遇到的坑
- CCF_Java_201612-2_工资计算
- 群晖网络不通_群晖系统安装zerotier one进行内网穿透过程中常见问题及解决方法...
- Docker | Docker 快速搭建 TensorRT 环境(超详细)
- html选择文件夹控件,File文件控件,选中文件(图片,flash,视频)即立即预览显示
- u-boot (1) —— 编译分析