头歌资源库(25)地图着色

一、 问题描述

       任何平面区域图都可以用四种颜色着色,使相邻区域颜色互异。这就是四色定理。要求给定区域图,排出全部可能的着色方案。例如,区域图如下图所示:

要求用四种颜色着色。

则输入: 10 4 (分别表示区域数和颜色数)

0 1 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0

输出结果为:1584

二、算法思想   

        这个问题可以使用回溯法来解决。我们可以使用一个列表来记录每个区域的颜色,初始时所有区域都没有着色。然后从第一个区域开始,尝试给它着色,并检查是否满足相邻区域颜色互异的条件。如果满足条件,则继续下一个区域的着色,直到所有区域都着色完成。如果不满足条件,则回溯到上一个区域,尝试其他颜色。

三、代码实现  

#include <stdio.h>
#include <stdbool.h>#define MAXN 10int graph[MAXN][MAXN]; // 区域图
int colors[MAXN]; // 存储每个区域的颜色
int n, m; // 区域数和颜色数
int count = 0; // 方案数// 检查某种颜色是否可以用于某个区域
bool isSafe(int v, int c) {for (int i = 0; i < n; i++) {if (graph[v][i] && c == colors[i]) {return false;}}return true;
}// 递归函数,尝试为每个区域选择颜色
void graphColoring(int v) {if (v == n) {count++;return;}for (int c = 0; c < m; c++) {if (isSafe(v, c)) {colors[v] = c;graphColoring(v + 1);colors[v] = -1; // 回溯}}
}int main() {scanf("%d %d", &n, &m);// 读取区域图for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {scanf("%d", &graph[i][j]);}}// 初始化颜色数组for (int i = 0; i < n; i++) {colors[i] = -1;}// 开始递归着色graphColoring(0);printf("%d\n", count);return 0;
}

 执行结果   

 结语      

创造机会的人是勇者

等待机会的是愚者 

!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/45243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ZhangQian AI模型部署】目标检测、SAM、3D目标检测、旋转目标检测、人脸检测、检测分割、关键点、分割、深度估计、车牌识别、车道线识别

在模型部署落地&#xff08;主要部署到rk3588&#xff09;折腾了这么多年&#xff0c;把这些年折腾过的模型整理了一下&#xff0c;所有的流程说明、代码模型都完全开放的&#xff0c;欢迎交流学习。有的是为了项目、有的是为了学习、还有的是为了找点事做、有的完全是为了安抚…

字节码编程bytebuddy之实现抽象类并并添加自定义注解

写在前面 本文看下使用bytebuddy如何实现抽象类&#xff0c;并在子类中添加自定义注解。 1&#xff1a;代码 1.1&#xff1a;准备基础代码 类和方法注解 package com.dahuyou.bytebuddy.cc.mine;import java.lang.annotation.ElementType; import java.lang.annotation.Re…

Open3D 提取点云的重叠区域和非重叠区域

目录 一、概述 二、代码实现 三、实现效果 3.1原始点云 3.2处理后点云 一、概述 在点云处理中,提取点云的重叠区域和非重叠区域可以提供有价值的信息,用于多种应用。以下是详细解释及其作用: 配准质量评估:在多视角点云拼接或配准过程中,通过分析重叠区域,可…

python-27-零基础自学python

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; 统计文本单词数、 解决问题&#xff1a; gbk codec cant decode byte 0x9d in position 995: illegal multibyte sequence” 练习内容&#xff1a; 练习10-10&#xff1a;常见单词 …

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第二十六章 安装超级终端软件

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

短视频矩阵系统是什么?怎么搭建短视频矩阵系统?一文了解矩阵模式

在数字时代&#xff0c;短视频已成为信息传播的新宠&#xff0c;而短视频矩阵系统则是品牌和个人在短视频领域取得突破的重要工具。那么&#xff0c;短视频矩阵系统究竟是什么&#xff1f;如何搭建这样一个高效的系统&#xff1f;它又能够解决哪些问题呢&#xff1f;本文将为您…

Memcached客户端库对决:解锁高性能缓存的钥匙

标题&#xff1a;Memcached客户端库对决&#xff1a;解锁高性能缓存的钥匙 Memcached作为一个高效的分布式内存缓存系统&#xff0c;在提升应用性能和扩展性方面发挥着关键作用。为了与Memcached服务器进行交互&#xff0c;开发者可以使用多种客户端库。这些库提供了丰富的API…

Spring中事件监听器

实现ApplicationListener接口 Configuration public class A48 {public static void main(String[] args) {AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(A48.class);context.getBean(MyService.class).doBusiness();context.close()…

C#绘制阻抗圆图初步

阻抗圆图&#xff0c;或者叫史密斯图&#xff0c;是无线电设计方面用的&#xff1b; 基本的阻抗圆图如下&#xff0c; 下面尝试用C#能不能画一下&#xff1b; 先在网上找一个画坐标的C#类&#xff0c;它的效果如下&#xff1b; 自己再增加一个函数&#xff0c;可以绘制中心在…

地址翻译过程(TLB-->页表-->Cache-->主存-->外存)

目录 1.地址结构 2.查找快表或页表&#xff1a;从虚拟地址--->物理地址 3.通过物理地址访问数据 设某系统满足以下条件&#xff1a; •有一个TLB与一个data Cache •存储器以字节为编址单位 •虚拟地址 14位 •物理地址 12位 •页面大小为 64B •TLB 为四路组相联&#x…

Windows 10怎麼系統中修改IP地址-okeyproxy

本文將詳細介紹在Windows 10系統中修改IP地址的步驟&#xff0c;並提供一些創新性的技巧&#xff0c;幫助大家更好地管理網路設置。 IP地址分為動態IP和靜態IP兩種。動態IP由路由器或ISP&#xff08;互聯網服務提供商&#xff09;自動分配&#xff0c;靜態IP則是手動設置的固定…

消防灭火设备软体水枪的使用方法

软体水枪是一款专为消防、应急救援等领域设计的灭火工具。其内胆采用大容量设计&#xff0c;能够储存足够的灭火剂&#xff0c;满足长时间、大范围的灭火需求。软体水枪是一种高效、便捷的灭火工具。它利用压力和流体力学原理&#xff0c;通过扣动扳机将储水箱中的水以高速喷射…

tp计算距离,筛选0-10km距离内商家

$field_lat lat;// 数据库字段名 - 纬度 -90到90 $field_lng lng;// 数据库字段名 - 经度 -180到180 $lat $params[lat];// 数据库字段名 - 纬度 -90到90 $lng $params[lng];// 数据库字段名 - 经度 -180到180 //语句 $field "(6378.138 …

【数据结构】笔试面试中常用的数据结构操作

笔试面试中常用的数据结构操作 排序与查找 请编写一个C程序&#xff0c;实现冒泡排序。 #include <stdio.h> // 冒泡排序函数 void bubbleSort(int arr[], int n) {for (int i 0; i < n - 1; i) {for (int j 0; j < n - i - 1; j) {if (arr[j] > arr[j 1]…

《金山 WPS AI 2.0:重塑办公未来的智能引擎》

AITOP100平台获悉&#xff0c;在 2024 世界人工智能大会这一科技盛宴上&#xff0c;金山办公以其前瞻性的视野和创新的技术&#xff0c;正式发布了 WPS AI 2.0&#xff0c;犹如一颗璀璨的星辰&#xff0c;照亮了智能办公的新征程&#xff0c;同时首次公开的金山政务办公模型 1.…

【python学习】将两个 数组连接起来

在Python中&#xff0c;将两个数组&#xff08;或列表&#xff09;连接起来非常简单。对于Python的原生列表&#xff0c;你可以使用加号()操作符或者extend()方法。对于NumPy数组&#xff0c;你可以使用numpy.concatenate()函数或numpy.append()函数&#xff08;尽管numpy.appe…

Spring AOP 使用方式

ProxyFactory代理工厂提供了基于切面构造代理对象的能力&#xff0c;Spring框架结合IOC对此进行了一层封装以适应多种场景。封装后为用户提供了一套Spring风格的“API”(使用方式)。 1 xml配置方式 引入AOP的schema: <beans xmlns"http://www.springframework.org/sche…

PyTorch | 加速模型训练的妙招

引言 提升机器学习模型的训练速度是每位机器学习工程师的共同追求。训练速度的提升意味着实验周期的缩短&#xff0c;进而加速产品的迭代过程。同时&#xff0c;这也表示在进行单一模型训练时&#xff0c;所需的资源将会减少。简而言之&#xff0c;我们追求的是效率。 熟悉 PyT…

padStart方法用来格式化数据

在别人写的代码中看到的padStart方法&#xff0c;没用过&#xff0c;浅浅记录一下~ padStart方法的使用 padStart是 字符串类型的方法&#xff0c;可以用来格式化字符串&#xff0c;在字符串添加指定的字符以达到指定的长度&#xff0c;例如&#xff1a;可以用来格式化日期 …

SpringSecurity框架【认证】

目录 一. 快速入门 二. 认证 2.1 登陆校验流程 2.2 原理初探 2.3 解决问题 2.3.1 思路分析 2.3.2 准备工作 2.3.3 实现 2.3.3.1 数据库校验用户 2.3.3.2 密码加密存储 2.3.3.3 登录接口 2.3.3.4 认证过滤器 2.3.3.5 退出登录 Spring Security是Spring家族中的一个…