**题意:**使用四种颜色对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. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

  2. 回溯法求地图填色实验(剪枝)

    回溯法求地图填色(剪枝) 文章目录 回溯法求地图填色(剪枝) (一) 问题求解 思维风暴(之前瞎想的,可以跳过) (二)算法思想:回溯 伪代码: 时间复杂度分析: (三)剪枝方向 1. 下层节点选取 ...

  3. java 地图四色着色算法_趣味地图系列之6 四色定理之我见

    四色定理(four color map theorem)是一个著名的数学定理[1],即对任意的(平面上的)地图染色,要求相邻的国家颜色不同,四种颜色即可完成着色. 南非数学家法兰西斯·古德里在1852 ...

  4. 如何用Tableau绘制涂色地图

    做数据分析的地域分析时,用地图的方式呈现出来更为直观一些,下面记录用Tableau10.5的地图功能做一个涂色的地图. 新建数据源连接要绘制地图的源数据表格 数据源导入后点击右下角的转到工作表 左侧列 ...

  5. 四色地图理论的图论证明

    四色地图理论的图论证明 四色地图理论我就不多说了,四色猜想与哥德巴赫猜想.费马定理成为了近代三大数学难题. 首先,大家看一个的图,平面中圆点标号1,2,3,4. 两两之间有连线.将平面切分为四个区域a ...

  6. 地图四色着图的C语言实现

    四色问题又称四色猜想.四色定理,是世界三大数学猜想之一.四色定理是一个著名的数学定理,通俗的说法是:每个平面地图都可以只用四种颜色来染色,而且没有两个邻接的区域颜色相同.1976年借助电子计算机证明了 ...

  7. c语言电子地图程序,地图四色着图的C语言实现

    四色问题又称四色猜想.四色定理,是世界三大数学猜想之一.四色定理是一个著名的数学定理,通俗的说法是:每个平面地图都可以只用四种颜色来染色,而且没有两个邻接的区域颜色相同.1976年借助电子计算机证明了 ...

  8. Python实现地图四色原理的遗传算法(GA)着色实现

    1 任务需求   首先,我们来明确一下本文所需实现的需求.   现有一个由多个小图斑组成的矢量图层,如下图所示:我们需要找到一种由4种颜色组成的配色方案,对该矢量图层各图斑进行着色,使得各相邻小图斑间 ...

  9. 橡皮擦的英语_从填字涂鸦到英语启蒙,家长口中的儿童版“秘密花园”涂色游戏测评【玩具测评】...

    #前情提要#丰富的拓展玩法让简单的穿珠游戏大不同,点击<手眼协调与数学启蒙,用线绳穿珠游戏促进能力发展>了解详情. 今天我们为大家带来了一篇绘画+英语启蒙学习玩具的测评报告.这款玩具是植绒 ...

最新文章

  1. java+c#+json+时间_C#与Json时间的转换
  2. bootstrap 横铺 行_Bootstrap 排版
  3. ie系列浏览器_2020下半年河北教师资格准考证打印只能用ie浏览器吗
  4. java logfaction_Java8 下 重构log
  5. 华为证实 P40 将没有 Google 服务;李世石退役;Python 3.8.1 发布 | 极客头条
  6. httpclient java 异步_Java的异步HttpClient
  7. cube一站式云原生机器学习平台-推理服务的工程化加速
  8. 3ds max制作宋惠乔的教程----作者: 火星时代 来源: 火星时代
  9. Modem2G/3G/4G/5G:高通平台SUPL配置方法总结
  10. ios常用第三方总结
  11. Realtek 1296 (RTD1296) OpenWRT Android 双系统全功能开发板
  12. [Swift]修改NSLayoutConstraint的multiplier
  13. Linux系统编程 | 01 -文件操作
  14. linux编辑状态a,linux 操作
  15. 创新思维对计算机专业的关系,创新思维复习题
  16. 用python输出沙漏_sandglass(沙漏)——一个让人解脱的python时间处理库
  17. fatal: unable to access 或者 fatal: could not read from remote repository
  18. np.array与np.ndarray的区别
  19. vSphere(一) 标准交换机和分布式交换机
  20. Web面试题汇总-自用

热门文章

  1. 建模simulink - xpc自定义模块库
  2. Ubuntu18.04安装Pycharm并将其添加至左侧收藏夹
  3. Vscode配置Vue插件Vetur自动补全和Eslint校验,正在保存“index.vue”: 从 “‘ESLint‘, ‘Vetur‘“ (configure)中获取代码操作
  4. 英语口语学习文章分享
  5. 关于win10基础上安装ubuntu遇到的坑
  6. CCF_Java_201612-2_工资计算
  7. 群晖网络不通_群晖系统安装zerotier one进行内网穿透过程中常见问题及解决方法...
  8. Docker | Docker 快速搭建 TensorRT 环境(超详细)
  9. html选择文件夹控件,File文件控件,选中文件(图片,flash,视频)即立即预览显示
  10. u-boot (1) —— 编译分析