描述

有一个R行C列的网格地图,每个国家是一个四连通区域。你的任务是用红,绿,蓝,黄四种颜色给地图着色,使得相邻国家的颜色不同。
一个人着色比较无趣,所以你想请女朋友陪你一起涂——你涂红绿,她涂蓝黄。当然,绅士是不会让让女朋友受累的,所以她最多只需涂5个国家(恰好5个也行)。
你的任务是统计有多少种着色的方法。注意,每个颜色都至少要用一次。

输入

输入包含不超过100组数据。每组数据第一行为两个整数R和C (1<=R,C<=20),即网格的行数和列数。以下R行每行C个大写字母。相同字母所组成的四连通区域代表一个国家。输入保证国家数目不超过30,并且大多数测试点的国家数都比较小。

输出

对于每组数据,输出测试点编号和着色方案数。

样例输入

2 4
AABB
BBAA
1 5
ABABA
4 7
AABAABB
ABBCCCB
BBAACBB
CCABBAC

样例输出

Case 1: 24
Case 2: 144
Case 3: 3776

思路:

以样例一为例

首先将给出的字符数组寻找连通块,将每个四连通的相同字母的每一块进行标号

即:AABB 转变为 :0011
       BBAA                 2233

然后进行缩点,将每一块编号相同的区域作为以这个编号的结点,构建邻接矩阵,即如果一个编号的四连通区域有其他编号,就说明这两个点连通

即有:0110
           1001
           1001
           0110

此时有了邻接矩阵后,可以直接搜索进行染色以统计方案数,但由于数据范围过大因此会超时,考虑剪枝

假设男性使用 A、B 两个颜色涂色,女性使用 C、D 两个颜色涂色,此时男性、女性的涂色顺序有四种:AB|CD、AB|DC、BA|CD、BA|DC

由于无论哪个颜色先涂,结果最终都是等价的,因此规定男性使用的第一个颜色是 A,女性使用的第一个颜色是 C,然后进行搜索,最终求出来的 res 是结果的 1/4,因此最终答案为 res*4

源程序

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 2000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
int n,m;
char mp[N][N];//字符矩阵
int grade[N][N];//连通块标号
int G[N][N];//邻接矩阵
int colors[N];
void dfs(int x,int y,int num){//寻找连通块记录标号grade[x][y]=num;for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];if(nx<0||nx>=n||ny<0||ny>=m)continue;if(mp[x][y]==mp[nx][ny]&grade[nx][ny]==-1)dfs(nx,ny,num);}
}
void buildMap(int num){//建立邻接矩阵for(int x=0;x<m;x++){for(int y=0;y<num;y++){for(int k=0;k<4;k++){int nx=x+dx[k];int ny=y+dy[k];if(nx<0||ny<0||nx>=num||ny>=num)continue;if(grade[x][y]!=grade[nx][ny]){int nodeX=grade[x][y];int nodeY=grade[nx][ny];G[nodeX][nodeY]=1;G[nodeY][nodeX]=1;}}}}
}
bool judge(int step,int color,int num){for(int i=0;i<num;i++)if(G[step][i]==1&&colors[i]==color)return false;return true;
}
int dye(int step,int A,int B,int C,int D,int num){//染色int res=0;if(step==num){if(A!=0&&B!=0&&C!=0&&D!=0)res++;return res;}if(judge(step,0,num)){colors[step]=0;res+=dye(step+1,A+1,B,C,D,num);}if(A&&judge(step,1,num)){colors[step]=1;res+=dye(step+1,A,B+1,C,D,num);}if(C+D<5&&judge(step,2,num)){colors[step]=2;res+=dye(step+1,A,B,C+1,D,num);}if(C&&C+D<5&&judge(step,3,num)){colors[step]=3;res+=dye(step+1,A,B,C,D+1,num);}colors[step]=-1;return res;
}
int main(){int Case=1;while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;i++){getchar();for(int j=0;j<m;j++)scanf("%c",&mp[i][j]);}//寻找连通块,并进行标号memset(grade,-1,sizeof(grade));int num=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grade[i][j]==-1){dfs(i,j,num++);}}}//建立邻接矩阵memset(G,0,sizeof(G));buildMap(num);//染色memset(colors,-1,sizeof(colors));int res=dye(0,0,0,0,0,num);printf("Case %d: %d\n",Case++,res*4);}return 0;
}

地图的四着色 (CSU-1508)相关推荐

  1. 算法:根据四色定理(Four color theorem),求出地图的所有着色方案

    地图着色,需要每一个区域都使用一种颜色来进行填充,然后为了与相邻接壤的区域分开,就要求两个接壤的区域需要使用不同的颜色.四色定理的意思是,最多只需要四种颜色,就可以为所有的地图进行全部区域着色,且任意 ...

  2. Python练手项目:用中国地图验证四色地理

    根据百度百科的描述,四色问题认为"任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色.",不引起混淆的情况下一张地图只需四种颜色来标记就行.1976年6月,在美国伊利诺 ...

  3. Android百度地图(四)如何引入离线地图包

    Android百度地图(四)如何引入离线地图包 本文代码在http://blog.csdn.net/xyzz609/article/details/51955363的基础上进一步修改,有兴趣的同学可以 ...

  4. 基于Autoware制作高精地图(四)

    基于Autoware制作高精地图(四) 来了来了!它来了!肯定有小伙伴遇到过,当用Autoware导入自己制作的高精地图(也就是.csv文件)的时候会出现带有方向的车道线lane不显示的情况,或者显示 ...

  5. carla创建地图(四)基于ue4创建地图

    对于carla这其实是一种没有完成的方法,因为没有办法产生xodr文件,但是其实可以通过采集的道路经纬度通过脚本生成osm文件(已经补充了相关脚本).这种方法的优势是自由度高,因为在ue4里其实什么都 ...

  6. SRPG游戏开发(二十六)第七章 寻路与地图对象 - 四 地图对象(Map Object)

    返回总目录 第七章 寻路与地图对象(Pathfinding and Map Object) 这一章主要进行寻路与地图对象的部分工作. 第七章 寻路与地图对象(Pathfinding and Map O ...

  7. Android游戏开发之地图编辑器的使用以及绘制地图 (四)

    雨松MOMO带你走进游戏开发的世界之地图编辑器的使用以及绘制地图 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong ...

  8. Android基于mAppWidget实现手绘地图(四)--如何附加javadoc

    如何把javadoc添加到代码库中? How to attach javadoc to the library? 项目属性-->Java Build Path-->Libraries.选择 ...

  9. 图论 —— 着色问题

    [概述] 图着色问题(Graph Coloring Problem, GCP),是最著名的 NP-完全问题之一. 图的 m-着色问题是指:给定无向连通图 G 与 m 种不同的颜色,找出所有不同的着色法 ...

最新文章

  1. linux虚拟用户创建目录权限不足,在CentOs中安装vsFtpd并创建多个虚拟用户,且不同的用户拥有不同的权限以及指向不同的文件夹...
  2. android studio miui8,MIUI8上在Android Studio运行出错集及其解决方案
  3. python学习手册条件-Python学习手册之控制结构(一)
  4. 第五人格每天服务器维护多长时间,第五人格:每天玩的时间并不长,大概一天1-5局...
  5. 【转】[完全免费] 在线UML Class Diagram 类图工具 - 教程第1部分
  6. 堆排序和归并排序 java代码实现
  7. c++ winpcap开发(6)
  8. Uniform Distribution均匀分布
  9. 不用担心越界,不用中间变量的数值交换
  10. python语法学习第十天--魔法方法
  11. 2021年计算机网络常见面试题
  12. 【论文解读】AVOD-Net 用于自动驾驶的聚合视图3D对象检测网络
  13. Struts 2的基石——拦截器(Interceptor)详细讲解
  14. 关于tb双十一成交量
  15. 管道与系统调用pipe
  16. 中秋福利!三维重建/SLAM/点云/相机标定/深度估计/缺陷检测课程
  17. 考试行测常识判断法律知识备考误区提示
  18. java 配置文件加密_Spring cloud config 配置文件加密方式
  19. 贵州建筑施工劳务资质备案流程
  20. 基于Halcon学习的一维码识别【十三】ean13.hdev

热门文章

  1. 【项目总结】达能益力--官网
  2. 无法将 DBNull.Value 强制转换为类型“System.DateTime”。请使用可空类型
  3. 格密码教程(六):高斯二维格规约,解决SVP问题
  4. 什么是贝叶斯定理?朴素贝叶斯有多“朴素”?终于有人讲明白了
  5. 一文看懂用Python读取Excel数据
  6. 黑客魔术!如何黑掉一台根本不联网的电脑
  7. mkv210_image.c详解
  8. centos 释放swap_centos6.6关闭与打开swap(整理)
  9. 2022年第一个线上问题,被领导骂惨了!
  10. ConcurrentHashMap核心原理,这次彻底给整明白了