C语言地图着色
贪心法给中国地图上色
cout<<endl;
}
cout<<endl;
fin.close();
}
int Graph::IsEdge(int v1,int v2)
{
if(Edge[v1][v2]>0)
return 1;
else return 0;
}
void Coloring ();//产生图的着色方案
};
/*************************Graph.cpp*****************/
int Graph::check(string a)
{
for(int i=0;i<n;i++)
if(vex[i]==a)
color=newcolor;
}
/*****************************color_greedy.cpp********************/
color_greedy::color_greedy(int n0,int m0,int e0):g(n0,e0)
{
n=n0;
/*******************************subset.cpp***********************/
subset::subset(int newcolor,int m)
{
n=m;
if(n>0)
newclr=new int[n];
else
newclr=0;
for(int i=0;i<n;i++)//找图中第一个未着色的结点v
图的着色问题--C++实现(含详细注释)
图的着色问题一、题目简述(1) 图的m-着色判定问题给定一个无向连通图 G 和 m 种不同的颜色。
用这些颜色为图 G 的各顶点着色,每个顶点着一种颜色,是否有一种着色法使 G 中任意相邻的两个顶点着不同颜色?(2) 图的m-着色优化问题若一个图最少需要 m 种颜色才能使图中任意相邻的两个顶点着不同颜色,则称这个数 m 为该图的色数。
求一个图的最小色数 m 的问题称为m-着色优化问题。
二、算法思想1. m-着色判定问题总体思想:通过回溯的方法,不断为每一个节点着色,每个点的颜色由一个数字代表,初始值为1。
在对前面 step - 1 个节点都合法的着色之后,开始对第 step 个节点进行着色。
如果 n 个点均合法,且颜色数没有达到 m 种,则代表存在一种着色法使 G中任意相邻的两个顶点着不同颜色。
具体步骤:1. 对每个点 step ,有 m 种着色可能性,初始颜色值为1。
2. 检查第 step 个节点颜色的可行性,若与某个已着色的点相连且颜色相同,则不选择这种着色方案,并让颜色值加1,继续检查该点下一种颜色的可行性。
3. 如果第 step 点颜色值小于等于 m ,且未到达最后一个点,则进行对第 step + 1 点的判断。
4. 如果第 step 点颜色值大于 m ,代表该点找不到合适的分配方法。
此时算法进行回溯,首先令第 step 节点的颜色值为0,并对第 step - 1 个点的颜色值+1后重新判断。
5. 如果找到一种颜色使得第 step 个节点能够着色,说明 m 种颜色的方案是可行的。
6. 重复步骤2至5,如果最终 step 为0则代表无解。
2. m-着色优化问题基于问题1,对于一个无向图 G ,从1开始枚举染色数,上限为顶点数,第一个满足条件的颜色数即为所求解。
三、实现过程(附代码)1. m-着色判定问题#include<iostream>using namespace std;int color[100]; // 每个点的颜色int mp[100][100]; // 图的邻接矩阵int n, m, x; // n顶点,m种颜色方案,x条边bool check(int step) {// 判断与step点相邻的点,颜色是否与step点相同,若相同则返回falsefor (int i=1; i<=n; i++) {if (mp[step][i] ==1&&color[i] ==color[step]) {return false;}}return true;}bool Solve(int m) {// 求解是否可以找到一种可行的染色方案int step=1; // step指示当前节点while (step>=1) {color[step] +=1; // 假定颜色值从1开始,若为回溯,选择下一种方案while (color[step] <=m) { // 按照问题条件选择第step点颜色if (check(step)) {break;} else {color[step]++; // 搜索下一个颜色}}if (color[step] <=m&&step==n) { // 如果找完n个点,且染色方法小于等于m种 return true;} else if (color[step] <=m&&step<n) {step++; // 求解下一个顶点} else { // 如果染色数大于m个,回溯color[step] =0; // 回溯,该点找不到合适的分配方法,对上一点进行分析step--;}}// 如果step退到0,则代表无解return false;}int main() {int i, j;bool ans=false;cout<<"输入顶点数n和着色数m"<<endl;cin>>n>>m;cout<<"输入边数"<<endl;cin>>x;cout<<"具体输入每条边"<<endl;for (int p=0; p<x; p++) { // 以无向邻接矩阵存储边cin>>i>>j;mp[i][j] =1;mp[j][i] =1;}if (Solve(m)) {cout<<"有解";} else {cout<<"无解";}return0;}2. m-着色优化问题#include<iostream>using namespace std;int color[100]; // 每个点的颜色int mp[100][100]; // 图的邻接矩阵int n, m, x; // n顶点,m种颜色方案,x条边bool check(int step) {// 判断与step点相邻的点,颜色是否与step点相同,若相同则返回falsefor (int i=1; i<=n; i++) {if (mp[step][i] ==1&&color[i] ==color[step]) {return false;}}return true;}bool Solve(int m) {// 求解是否可以找到一种可行的染色方案int step=1; // step指示当前节点while (step>=1) {color[step] +=1; // 假定颜色值从1开始,若为回溯,选择下一种方案while (color[step] <=m) { // 按照问题条件选择第step点颜色if (check(step)) {break;} else {color[step]++; // 搜索下一个颜色}}if (color[step] <=m&&step==n) { // 如果找完n个点,且染色方法小于等于m种 return true;} else if (color[step] <=m&&step<n) {step++; // 求解下一个顶点} else { // 如果染色数大于m个,回溯color[step] =0; // 回溯,该点找不到合适的分配方法,对上一点进行分析step--;}}// 如果step退到0,则代表无解return false;}int main() {int i, j;bool ans=false;cout<<"输入顶点数n"<<endl;cin>>n;cout<<"输入边数"<<endl;cin>>x;cout<<"具体输入每条边"<<endl;for (int p=0; p<x; p++) { // 以无向图邻接矩阵存储边 cin>>i>>j;mp[i][j] =1;mp[j][i] =1;}for (m=1; m<=n; m++) { // 从小到大枚举着色数mif (Solve(m)) { // 如果有解,输出答案并跳出循环cout<<"最小色数m为 "<<m;break;}}return0;}四、结果及分析问题1测试用例:问题2测试用例:经检验,最少着色数的范围为2-4,意味着使 G 中任意相邻的两个顶点着不同颜色最多需要4种颜色。
c语言 四色问题 邻接矩阵
c语言四色问题邻接矩阵四色问题是指在平面图上,如何用四种颜色对图中的各个区域进行着色,使得相邻的区域颜色不能相同。
邻接矩阵是用矩阵表示图中顶点之间的连接关系的一种方式。
下面是C语言实现使用邻接矩阵解决四色问题的代码:c#include <stdio.h>#include <stdlib.h>#define MAX_VERTICES 50int adjacent[MAX_VERTICES][MAX_VERTICES];int n;void init_adjacency_matrix() {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {adjacent[i][j] = 0;}}void add_edge(int i, int j) {adjacent[i][j] = 1;adjacent[j][i] = 1;}int get_color(int solution[], int vertex) {for (int color = 1; color <= 4; color++) {int conflict = 0;for (int i = 0; i < n; i++) {if (adjacent[vertex][i] && solution[i] == color) {conflict = 1; color conflictbreak;}}if (!conflict) {return color;}}return -1; no valid color}int is_solution_valid(int solution[]) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (adjacent[i][j] && solution[i] == solution[j]) {return 0; color conflict}}}return 1; solution is valid}void print_solution(int solution[]) {printf("Solution: ");for (int i = 0; i < n; i++) {printf("%d ", solution[i]);}printf("\n");}void backtrack(int solution[], int vertex) {if (vertex == n) {if (is_solution_valid(solution)) {print_solution(solution);exit(0);}return;}for (int color = 1; color <= 4; color++) {solution[vertex] = color;backtrack(solution, vertex + 1);solution[vertex] = 0;}}int main() {n = 7;init_adjacency_matrix();add_edge(0, 1); add_edge(0, 2); add_edge(1, 2);add_edge(1, 3); add_edge(2, 4); add_edge(3, 4);add_edge(3, 5); add_edge(4, 6); add_edge(5, 6);int solution[MAX_VERTICES] = {0};backtrack(solution, 0);printf("No solution found.\n");return 0;}其中,`adjacent`是邻接矩阵,`n`是顶点的个数,`init_adjacency_matrix()`用于初始化邻接矩阵,`add_edge()`用于添加边,`get_color()`用于获取某个顶点的可用颜色,`is_solution_valid()`用于判断当前解是否合法,`print_solution()`用于打印解,`backtrack()`是回溯函数,`main()`函数中定义了一个简单的图并调用回溯函数求解。
中国地图四色染色问题
中国地图四色染色问题LtD中国地图四色染色问题一、问题描述将中国地图用四种不同的颜色红、蓝、绿、黄来染色,要求相邻的省份染色不同,有多少种不同的方案?二、问题分析本文将中国地图的34个省、直辖市、自治区、以及特别行政区转化为图论中的图模型。
其中每个省、市、自治区、特别行政区用图中的一个结点表示,两个结点间联通仅当两个板块接壤。
那么问题转化为图论中的染色问题。
由于海南、台湾省不与其它任何省份相邻,所以如果除海南、台湾外如果有n种染色方法,那么加上海南和台湾省后,有4*4*n种染色方法。
下面考虑除海南和台湾后的32个结点的染色方法。
三、中国地图染色方法采用分开海南和台湾省的分析方法,一方面的原因是除海南和台湾后的32个结点,可以组成一个联通图,因为海南省和台湾省不和任何其它省份邻接。
另一方面,我们建立一个联通图模型后,染色问题可以用深度优先遍历算法DFS,或者广度优先遍历算法BFS来解决,由于该方法的时间复杂度较高,属于暴力法,少考虑两个省份可以减少计算机处理此问题的时间。
本文采用DFS算法来解决这个染色问题。
3.1 DFS算法简介DFS算法是图的一种图的深度遍历算法,即按照往深的地方遍历一个图,假设到一个分支的尽头,那么原路返回到最近一个未被遍历的结点,继续深度遍历。
DFS遍历的具体步骤可为下:1)标记图中所有结点为“未访问〞标记。
2)输出起始结点,并标记为“访问〞标记3)起始结点入栈4)假设栈为空,程序结束;假设栈不为空,取栈顶元素,假设该元素存在未被访问的邻接顶点,那么输出一个邻接顶点,并置为“访问〞状态,入栈;否那么,该元素退出栈顶。
3.2 染色问题中的DFS算法设计我们先对任一结点染色,然后用DFS从该结点出发,遍历该图,遍历的下一结点颜色染为与之相邻的结点不同的颜色即可。
如果该结点无法染色那么回到上一个结点重新染色,直到所有的结点都被染色即可。
最后统计染色种数。
染色问题的算法伪代码可以描述如下:color_DFS(当前染色结点):for i in 所有颜色{ while j的已染色邻接点if 结点j相邻接点被染成i颜色标记并breakif 未被标记{当前结点染为i色if 当前结点为最后一个结点endelsecolor_DFS(next)}}3.3 数据结构设计为了实现DFS染色算法,我们需要设计相应的数据结构。
地图着色问题
地图着色问题说明:任何平面区域图都可以用四种颜色着色,使相邻区域颜色互异。
这就是四色定理。
要求给定区域图排出全部可能的四着色方案。
区域相邻关系用矩阵表示,每个区域又一个序号,(从0七连续排列)adj【i】【j勘硎厩 騣,j相邻。
数组cilir记录每个区域上着的色,用1.2.3.4表示。
程序应包括四个函数:coloring对所给邻接矩阵找着全部着色方案色乐的:对区域i在指定的颜色范围内选出可选颜色或报告失败(失败返回-1)辞令次日卡:判断对区域i在指定的颜色c是否可用八寸卡:选色失败时或完成一种着色方案时进行回溯另外可定义output函数,每次输出一种着色方案/*递归算法:void Coloring(区域 n)1. 令颜色集ClrSet={ 没有被区域n的邻居区域使用的颜色 }.2. 如果ClrSet是空集,返回.3. 对ClrSet中的每种颜色c,作循环:3.1 为区域n着色c。
3.2 如果所有区域都已着色(n是最后一个区域),那么显示/保存着色结果.3.3 否则对下一个尚未着色的区域(n+1),调用Coloring(n+1).4. 把区域n变为没有着色的区域.--------------------------------------------------------*/template<int node_count = 8>class CColoring{private:typedef int node_type;typedef int color_type;typedef std::set<node_type> node_set;typedef std::vector<color_type> color_array;public:void operator()(const int _Matrix[node_count][node_count]){matrix = _Matrix;colors_of_nodes.resize(node_count, 0); total_count = 0;coloring(0);}private:void coloring(node_type n){// 颜色的使用情况std::vector<bool> used_colors;node_type m;color_type c;// 初始化颜色的使用情况used_colors.resize(color_count, false);// 遍历每个与区域n相邻的区域mfor(m = 0; m < node_count; ++m){if(matrix[n][m]){// 获取m的颜色c = colors_of_nodes[m];// m已着色if(c != 0)used_colors[c] = true;}}// 遍历每个未被n的邻居使用的颜色cfor(c = 1; c < color_count; ++c){if(!used_colors[c]){// 为n着色ccolors_of_nodes[n] = c;// 着色完毕if(n >= node_count - 1)++total_count;// 输出结果_tprintf(_T("---------------------\n"));_tprintf(_T("Method %d:\n"), total_count);for(m = 0; m < node_count; ++m){_tprintf(_T("node: %d, color: %d\n"), m, colors_of_nodes[m]); }}// 还有区域没有着色else{// 为下一个未着色的区域,调用coloring()coloring(n + 1);}}}// 将n设置为没有着色的区域colors_of_nodes[n] = 0;}// 0表示无色,1-4表示4种不同颜色static const int color_count = 5;// 邻接矩阵const int (* matrix)[node_count];// 各区域对应的颜色color_array colors_of_nodes;// 总的着色方案数int total_count;};void main(){int Matrix[4][4] ={{ 0, 1, 0, 0 },{ 1, 0, 0, 0 },{ 0, 0, 0, 1 },{ 0, 0, 1, 0 },};CColoring<4> coloring;coloring(Matrix);}/*递归算法:void Coloring(区域 n)1. 令颜色集ClrSet={ 没有被区域n的邻居区域使用的颜色 }.2. 如果ClrSet是空集,返回.3. 对ClrSet中的每种颜色c,作循环:3.1 为区域n着色c。
基于C语言的GIS地图着色问题的实现
* 收稿日期: 2012—05—03 作者简介: 郭仁安( 1983—) ,男,助理工程师,主要从事工程测量,GIS 应用研究等工作。
122
城市勘测
2012 年 12 月
一个点,并给每个城市编号,相邻的城市之间用直线连 接。据此做出邻接矩阵,若第 i 个城市与第 j 个城市相 邻,则 metro[i][j]= 1,否则 metro[i][j]= 0,照编号 从小到大的顺序检查每个城市,对每个城市从 1 到 4 使用 4 种颜色着色,若当前颜色可用( 即不与相邻城市 颜色相同) ,则着色; 否则测试下一种颜色。
2 地图着色问题的数据模型
在地图中两个城市之间只可能存在着两种关系相 离和相交关系。因此在计算机中可用 0、1 表示这两种 关系,用 0、1 分别来表示两城市之间的相离和相邻( 相
邻是指两城市之间有公共的边界) ,并人为规定相同的 城市与城市之间的关系是 0。由于一幅图中城市太 多,为使问题简化,现就用如下 9 个区域( 设每个区域 所代表不同的城市) 来进行模拟,如图 1 所示。用 0、1 将两者的关系由矩阵加以表示,如图 2 所示,不难看出 它们两两之间的关系是邻接对称矩阵。
中国地图着色源代码
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//15
{0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0},//8
{0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0},//9
{0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0},//28
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0},//29
#include <iostream>
#include <string>
#include <time.h>
using namespace std;
#define MaxSize 34
#define N 4
int color[10]={0};
string name[34]={"广西","广东","云南","贵州","湖南","江西","福建",
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},//30
中国地图四色染色问题
中国地图四色染色问题一、问题描述将中国地图用四种不同的颜色红、蓝、绿、黄来染色,要求相邻的省份染色不同,有多少种不同的方案?二、问题分析本文将中国地图的34个省、直辖市、自治区、以及特别行政区转化为图论中的图模型。
其中每个省、市、自治区、特别行政区用图中的一个结点表示,两个结点间联通仅当两个板块接壤。
则问题转化为图论中的染色问题。
由于海南、台湾省不与其它任何省份相邻,所以如果除海南、台湾外如果有n种染色方法,那么加上海南和台湾省后,有4*4*n种染色方法。
下面考虑除海南和台湾后的32个结点的染色方法。
三、中国地图染色方法采用分开海南和台湾省的分析方法,一方面的原因是除海南和台湾后的32个结点,可以组成一个联通图,因为海南省和台湾省不和任何其它省份邻接。
另一方面,我们建立一个联通图模型后,染色问题可以用深度优先遍历算法DFS,或者广度优先遍历算法BFS来解决,由于该方法的时间复杂度较高,属于暴力法,少考虑两个省份可以减少计算机处理此问题的时间。
本文采用DFS算法来解决这个染色问题。
3.1 DFS算法简介DFS算法是图的一种图的深度遍历算法,即按照往深的地方遍历一个图,若到一个分支的尽头,则原路返回到最近一个未被遍历的结点,继续深度遍历。
DFS遍历的具体步骤可为下:1)标记图中所有结点为“未访问”标记。
2)输出起始结点,并标记为“访问”标记3)起始结点入栈4)若栈为空,程序结束;若栈不为空,取栈顶元素,若该元素存在未被访问的邻接顶点,则输出一个邻接顶点,并置为“访问”状态,入栈;否则,该元素退出栈顶。
3.2 染色问题中的DFS算法设计我们先对任一结点染色,然后用DFS从该结点出发,遍历该图,遍历的下一结点颜色染为与之相邻的结点不同的颜色即可。
如果该结点无法染色则回到上一个结点重新染色,直到所有的结点都被染色即可。
最后统计染色种数。
染色问题的算法伪代码可以描述如下:color_DFS(当前染色结点):for i in 所有颜色{ while j的已染色邻接点if 结点j相邻接点被染成i颜色标记并breakif 未被标记{当前结点染为i色if 当前结点为最后一个结点endelsecolor_DFS(next)}}3.3 数据结构设计为了实现DFS染色算法,我们需要设计相应的数据结构。
c语言地图着色问题课程设计
c语言地图着色问题课程设计一、课程目标知识目标:1. 让学生掌握C语言中的基本数据结构与算法,特别是图的相关概念和应用。
2. 让学生理解地图着色问题的实质,即图的顶点着色问题,并掌握其与计算机科学中的其他问题的联系。
3. 让学生掌握利用C语言解决地图着色问题的算法设计,包括但不限于回溯法、贪心算法等。
技能目标:1. 培养学生运用C语言进行问题分析、算法设计和程序编写的能力。
2. 培养学生通过调试和优化程序来提高问题解决效率的技能。
3. 培养学生运用逻辑思维和数学方法解决实际问题的能力。
情感态度价值观目标:1. 培养学生对计算机科学的兴趣,特别是对算法和程序设计的热情。
2. 增强学生的团队合作意识,通过小组讨论和协作完成复杂问题的解决。
3. 引导学生认识到编程解决问题的实际意义,理解计算机技术在国家和社会发展中的重要作用。
课程性质分析:本课程设计属于高中信息技术课程中的编程模块,以C语言为载体,着重于算法思维和问题解决能力的培养。
学生特点分析:高中生在逻辑思维和抽象思维方面有较好的发展,能够理解较为复杂的问题和算法。
他们对新鲜事物充满好奇,但需要通过具体案例和实践活动来加深理解。
教学要求:1. 教学内容与课本紧密结合,注重理论与实践相结合。
2. 教学过程中要注重启发式教学,引导学生主动探索和思考。
3. 教学评价应关注学生在知识掌握、技能应用和情感态度方面的综合表现。
二、教学内容1. 图的基本概念:图的结构定义,图的分类(有向图与无向图,连通图与非连通图),图的表示方法(邻接矩阵和邻接表)。
2. 地图着色问题背景知识:介绍地图着色问题的实际意义,分析其与图论中的顶点着色问题的联系。
3. 算法原理:- 回溯法:介绍回溯法的基本思想,解决地图着色问题的应用。
- 贪心算法:讲述贪心算法的设计思路,及其在地图着色问题中的运用。
4. C语言实现:- 编写图的表示结构体和基本操作函数。
- 实现回溯法和贪心算法解决地图着色问题的C程序。
地图着色问题c语言课程设计
地图着色问题c语言课程设计一、课程目标知识目标:1. 理解地图着色问题的基本概念,掌握其数学模型及相关算法。
2. 掌握C语言中数组、循环、条件判断等基本语法结构,并能将其应用于解决地图着色问题。
3. 了解贪心算法、回溯算法等基本算法在地图着色问题中的应用。
技能目标:1. 能够运用C语言编写解决地图着色问题的程序,具备一定的编程实践能力。
2. 能够通过分析地图着色问题,设计合适的算法,培养问题解决和算法设计能力。
3. 能够运用所学知识解决类似地图着色问题的实际应用,具备一定的知识迁移能力。
情感态度价值观目标:1. 培养学生面对问题积极思考、主动探究的学习态度,增强自信心和自主学习能力。
2. 培养学生团队合作意识,学会在团队中沟通、协作、共同解决问题。
3. 激发学生对计算机科学的兴趣,认识计算机编程在解决实际问题中的价值。
课程性质:本课程为实践性较强的课程,以项目为导向,注重培养学生的编程实践能力和问题解决能力。
学生特点:学生具备一定的C语言基础,了解基本语法结构,但对算法设计和实际应用尚不熟悉。
教学要求:通过讲解、示范、实践等多种教学手段,使学生掌握地图着色问题的相关知识,培养其编程实践能力和问题解决能力。
同时,关注学生情感态度的培养,激发学习兴趣,提高自主学习能力。
在教学过程中,将目标分解为具体的学习成果,以便进行教学设计和评估。
二、教学内容1. 地图着色问题基础知识:- 图的基本概念和表示方法- 地图着色的数学模型- 地图着色问题的实际意义和应用2. C语言基础语法复习:- 数组的使用- 循环结构(for、while)- 条件判断(if、else)3. 算法设计与分析:- 贪心算法原理及在地图着色问题中的应用- 回溯算法原理及在地图着色问题中的应用- 算法复杂度分析4. 编程实践:- 使用C语言实现地图着色问题求解- 调试与优化程序- 团队合作完成项目任务5. 教学进度安排:- 第一周:地图着色问题基础知识、C语言语法复习- 第二周:贪心算法、回溯算法原理讲解及案例分析- 第三周:编程实践,团队协作完成地图着色问题求解- 第四周:项目展示、点评、总结教学内容参考教材相关章节,结合课程目标进行组织,保证教学内容科学性和系统性。
c地图着色课程设计
c 地图着色 课程设计一、课程目标知识目标:1. 学生能够理解地图着色的基本概念和原则,掌握地图着色中常见的表示方法。
2. 学生能够运用不同的颜色和图案对地图进行合理的着色,准确表达各类地理信息。
3. 学生能够掌握地图着色在地理学习和生活中的实际应用。
技能目标:1. 学生能够运用地图着色技巧,提高地理空间思维能力。
2. 学生能够通过地图着色,培养观察、分析、解决问题的能力。
3. 学生能够运用地图着色方法,独立完成地理图表的制作。
情感态度价值观目标:1. 学生培养对地理学科的兴趣和热情,提高学习积极性。
2. 学生通过地图着色,增强对国家、地区、民族的认同感和归属感。
3. 学生养成合作、探究、创新的学习态度,提高团队协作能力。
课程性质:本课程以地图着色为主题,结合地理学科特点,注重培养学生的空间思维能力和实际操作能力。
学生特点:六年级学生具有较强的观察、分析和动手能力,对新鲜事物充满好奇,但注意力容易分散。
教学要求:教师应注重启发式教学,引导学生主动参与,关注个体差异,提高学生的实践操作能力。
在教学过程中,将课程目标分解为具体的学习成果,以便进行有效的教学设计和评估。
二、教学内容本课程依据课程目标,结合地理学科要求,选择以下教学内容:1. 地图着色基础知识:介绍地图着色的定义、作用和分类,使学生了解地图着色在地理信息表达中的重要性。
- 教材章节:第二章 地图与地理信息- 内容列举:地图着色的基本概念、分类及其应用2. 地图着色原则与方法:讲解地图着色的原则,如相邻区域不同色、同类地理要素同色等,并介绍常用的地图着色方法。
- 教材章节:第二章 地图与地理信息- 内容列举:地图着色的原则、方法及其在实际中的应用3. 地图着色实践操作:指导学生运用地图着色技巧,对给定的地图进行合理着色,并分析地图着色在地理学习和生活中的实际应用。
- 教材章节:第二章 地图与地理信息,第三章 地理图表制作- 内容列举:地图着色的实践操作、地理图表制作技巧4. 地图着色案例分析:分析典型地图着色案例,使学生了解地图着色在地理信息表达中的优劣及改进方法。
地图着色代码[新版]
地图着色(一)需求和规格说明地图上有不同国家(不同区域),每个国家都与其他一些国家邻接。
现要求对地图着色,使所有的国家和与它邻接的国家有不同的颜色。
通常由四种颜色就已足够。
(二)算法思想回溯算法:试探的方法向最终解逼近,即按某种模式生成一个部分解,然后检查是否合格。
若合格则扩展该部分解向最终解逼近;否则为不合格,无论怎样扩展都不会得到最后解,此时放弃部分解中的结果回溯到先前的部分解,然后重新按照某模式生成另一个部分解,直到获得最终解。
(三)调试与测试以8区域着色为例,各区域邻接情况如下(0表示邻接区域的结束):(四)运行结果:(五)源程序:#include<iostream>using namespace std;const int N=8;//定义一个常整型量N表示区域数量//若要改变所需着色的区域数量只需在此修改N的数值并添加邻接信息//根据习惯以(N+1)*(N+1)的二维数组储存N*N的地图邻接信息intneighbor[N+1][N+1]={{0},{0,2,3,4,5,6,8,0},{0,1,3,4,7,0},{0,1, 2,4,5,6,7,0},{0,1,2,3,6,7,8,0},{0,1,3,6,0},{0,1,3,4,5,8,0},{2,3,4,0},{1,4, 6,0}};//枚举颜色enum colorenum{red=1,blue,green,yellow};//定义结构体Area并增加属性值color表示区域颜色struct Area{colorenum color;};//Area类型数组表示区域编号Area areanum[N+1];//打印地图着色结果void prtmap(){for(int i=1;i<N+1;i++)switch(areanum[i].color){case 1:cout<<"第"<<i<<"区域着"<<"红色"<<endl;break;case 2:cout<<"第"<<i<<"区域着"<<"蓝色"<<endl;break;case 3:cout<<"第"<<i<<"区域着"<<"绿色"<<endl;break;case 4:cout<<"第"<<i<<"区域着"<<"黄色"<<endl;break;}}}//把颜色赋给区域void color_on(int area,int color){areanum[area].color=colorenum(color);}//着色进程void colorarea(int area_to_color)//参数area_to_color为当前要着色的区域编号{int result;for(int color_to_use=red;color_to_use<=yellow;color_to_use++)//neighbor[area_to_color][i]表示与area_to_color区域的第i个邻接区域for(int i=1;neighbor[area_to_color][i]!=0;i++){//与area_to_color邻接的区域已着c色的话不能着色返回0值并跳出循环否则可以着色返回1值if(areanum[neighbor[area_to_color][i]].color==colorenum(color _to_use)/*强制类型转换*/){result=0;break;}else{result=1;}}if(result==1){color_on(area_to_color,color_to_use);if(area_to_color<N)colorarea(++area_to_color);}}//检查区域是否因无色可着而被赋0值若存在该情况则回溯前一区域重新着色if(areanum[area_to_color].color==0){--area_to_color;for(intcolor_to_use=areanum[area_to_color].color+1;color_to_use<=yel low;color_to_use++){for(int j=1;neighbor[area_to_color][j]!=0;j++){if(areanum[neighbor[area_to_color][j]].color==colorenum(color _to_use)){result=0;break;}else{result=1;}}if(result==1){color_on(area_to_color,color_to_use);colorarea(++area_to_color);}}}}int main(){cout<<"地图上有不同国家(不同区域),每个国家都与其他一些国家邻接。
c 语法着色-概述说明以及解释
c 语法着色-概述说明以及解释1.引言1.1 概述C语言作为一种广泛应用的编程语言,在软件开发领域中扮演着重要的角色。
在编写C程序时,开发者通常需要使用文本编辑器或集成开发环境(IDE)来进行代码编辑和调试。
然而,当代码量较大或者涉及多个文件时,代码的可读性和易维护性就变得尤为重要。
为了帮助开发者更轻松地阅读和理解代码,语法着色(Syntax Highlighting)成为了必不可少的功能。
语法着色能够根据代码的语法结构将不同的元素着以不同的颜色进行展示,比如关键字、变量、注释等。
这种可视化的区分能够使代码更加清晰易懂,提高开发效率和准确性。
本文将探讨C语法着色的重要性以及在不同编辑器中的语法着色设置,旨在帮助开发者提高代码编写的质量和效率。
1.2 文章结构文章结构部分主要包括以下内容:1. 标题:文章标题为"c 语法着色"2. 目录:文章目录包含了大纲、引言、正文和结论四个部分。
3. 正文内容:文章主要包括C语言简介、语法着色的重要性和不同编辑器中的语法着色设置三个部分。
4. 结论:本部分对文章进行总结,提出应用建议,并展望未来可能的发展方向。
1.3 目的:本文的主要目的是探讨和介绍C语言语法着色在编程中的重要性以及在不同编辑器中的设置方式。
通过对C语言简介和语法着色的重要性进行讨论,读者可以更好地了解为什么需要对代码进行语法着色,并且了解不同编辑器中的语法着色设置对编程效率的影响。
通过本文的阐述,读者可以了解到如何在编程过程中利用语法着色来提高代码的可读性和可维护性,同时也能够更加高效地进行代码的编写和调试工作。
在结合实际案例和建议的基础上,帮助读者更好地理解并应用C语言语法着色的相关知识,从而提升自身的编程水平和工作效率。
通过本文的阐述和讨论,旨在引起读者对于代码优化和规范化的重视,帮助他们更好地理解和应用C语言语法着色技术,从而提升编程能力和工作效率。
希望通过本文的分享,能够对读者有所帮助,使他们更好地应用C语言语法着色技术,提高编程效率和代码质量。
四色着色法
从一个阅读器开始,给它使用任意一个时隙1,遍历它旁边的阅读器,使用与已经被使用并与他相邻的阅读器不同的时隙就行了。
理论上4种颜色就够了.地图的四色问题嘛!可能会有多组解。
用递归(dfs)就可以输出所有解了。
地图着色算法C语言源代码前面我写了一个地图着色(即四色原理)的C源代码。
写完以后想了一下,感觉还不完善,因为从实际操作的角度来考虑,四种可用的颜色放在旁边,不同的人可能会有不同的选择顺序,另外,不同的人可能会选择不同的城市作为着色的起点,而当时的程序没有考虑这个问题。
于是,把程序修改为下面的样子,还请同行分析并指出代码中的不足之处:#i nclude <stdio.h>#define N 21int allcolor[4];/*可用的颜色*/int ok(int metro[N][N],int r_color[N],int current){/*ok函数和下面的go函数和原来的一样,保留用来比较两种算法*/ int j;for(j=1;j<current;j++)if(metro[current][j]==1&&r_color[j]==r_color[current])return 0;return 1;}void go(int metro[N][N],int r_color[N],int sum,int current){int i;if(current<=sum)for(i=1;i<=4;i++){r_color[current]=i;if(ok(metro,r_color,current)){go(metro,r_color,sum,current+1);return;}}}void color(int metro[N][N],int r_color[N],int sum,int start){int i,j,k;r_color[start]=allcolor[0];for(i=start+1;i!=start;i=(i+1)%(sum+1))/*把所有编号看作一个环*/if(i==0)/*城市号从1开始编号,故跳过0编号*/continue;elsefor(j=0;j<4;j++){r_color[i]=allcolor[j];/*选取下一种颜色,根据allcolor中颜色顺序不同,结果不同*/for(k=1;k<i;k++)/*检查是否有冲突,感觉还可以改进,如使用禁忌搜索法*/if(metro[i][k]==1&&r_color[k]==r_color[i])break;if(k>=i)break;}}void main(){int r_color[N]={0};int t_color[N]={0};int i;int start;/*着色的起点*/int metro[N][N]={{0},{0,1,1,1,1,1,1},{0,1,1,1,1},{0,1,1,1,0,0,1},{0,1,1,0,1,1},{0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1},{0,1,0,1,0,1,1,1,1,1},{0,0,0,0,0,0,1,1,1},{0,0,0,0,0,0,1,1,1,1,0,0,1},{0,0,0,0,0,1,1,0,1,1,0,0,1,1,1,0,1},{0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,1},{0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1},{0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,0,1,1},{0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1},{0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1},{0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,0,1},{0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,1,1},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1},{0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,1,1,1},{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1}};allcolor[0]=1;allcolor[1]=2;allcolor[2]=3;allcolor[3]=4;/*选色顺序,顺序不同,结果不同*/start=1;/* clrscr();*/printf("\nAll color is:\n");for(i=0;i<4;i++)/*当前选色顺序*/printf("%d ",allcolor[i]);go(metro,r_color,20,1);printf("\nFirst method:\n");for(i=1;i<=20;i++)printf("%3d",r_color[i]);color(metro,t_color,20,start);printf("\nSecond method:\n");printf("\nAnd the start metro is:%d\n",start);for(i=1;i<=20;i++)printf("%3d",t_color[i]);}说是人性化着色,其实还有一个问题没有考虑,那就是操作员跳跃式着色,就像大家玩“扫雷”游戏一样。
基于C语言的GIS地图着色问题的实现
ABCDEFGHI A0101 10000 B101 0 111 00 C010 0 001 10 D1 0 0 0 1 1 0 0 0 E110 1 010 01 F010 1 101 01 G011 0 010 10 H0 0 1 0 0 0 1 0 0 I000001100
return; } } } int ColorUpCitySuccess( int metro[N][N],int r_color[N], int current) / / 此函数是要看上色是否成功。参数说明如下: metro[N] [N]: 地图城市的相互关系矩阵,r_color[N]为城市所要上的色 数组,current 当前的城市位置。 { /* 测试当前着色方案是否可行* /
} printf( " \ n 输出完毕,请看结果 \ n" ) ; system( " Pause" ) ; / / 此语句是对调用系统函数,做停顿 作用 }
5 实现结果展示
运行上面的程序,即可看到运行后的结果,并将其 结果对着前面的区域分别用 1、2、3、4 进行填充和用 1、2、3、4 所代表的 red、green、blue、yellow 结果进行填 充,得到如图 5 展示的结果图。
greedyarithmetic重庆市勘测院博士后科研工作站首批博士后研究人员进站本刊讯2012年1o月19日经重庆市人力资源和社会保障局批准渝人社函2012792号武汉大学和电子科技大学毕业的具有几年工作经历的两名博士进人重庆市勘测院博士后科研工作站成为该站引进的首批博士后研究人员
2012 年 12 月 第6 期
if( CurrentCityPosition < = SumCityN) / * 检查所有城市 */
四色问题(C语言)
四⾊问题(C语⾔)做过⼀个⾯试题,要求是写⼀个程序,求四⾊问题的所有解,即给定⼀个地图,已知共有N个区域,求⽤四种颜⾊给地图着⾊,要求相邻的两个区域不能着同⼀个⾊,要说明⼀下,有共同边的两个区域才算相邻,两个区域仅相交于⼀个点或有限个点不属于相邻,这就是著名的四⾊问题。
题⽬其实是给出了⼀个程序,让我填五个空,但我在答题过程中没有解答出来,不服⽓,回家⽤了两个半天才做出来,不得不承认⾃⼰的基本功不扎实啊。
在家⾥根据回忆能记起⼤概⽤了哪⼏个函数,基本结构也是能记得很多的,回来的⼯作就是复原之前看到过的这个题⽬,并且要解答出正确的结果。
当然⼀些细节记得不是很清楚,所以可能结构还没有题⽬中的合理,留给⾃⼰以后慢慢优化吧。
但总算是做出来了,因此写下来,留给以后参考。
所⽤的地图如下图所⽰:⽤来着⾊的地图执⾏代码如下:1 #include<stdio.h>2 #include<stdlib.h>34#define N 1056/* 打印出配⾊结果 */7int printcol(int *col)8 {9int i;10for(i=0;i<N;i++)11 {12 printf("%d ", col[i]);13 }14 printf("\n");15return0;16 }1718/* 回朔 */19int backcol(int i, int *col)20 {21int tmp, cur;22 cur = i;23 tmp=col[cur];24while(tmp>=4)25 {26 col[cur] = -1;27 cur--;28if(cur<0)29 {30return -1;31 }32 tmp = col[cur];33 }34 col[cur] = tmp+1;35return cur;36 }3738/* 判断某颜⾊是否可⽤ */39int colorOK(int i, int c, int *col, int adj[][N])40 {41int j;42for(j=0;j<N;j++)43 {44if(j!=i && adj[i][j] && col[j]==c)45 {46return -1;47 }48 }49return0;50 }5152/* 选择⼀种配⾊⽅案 */53int selcol(int i, int c, int *col, int adj[][N])54 {55if(!colorOK(i, c, col, adj))56 {57return c;58 }59return0;60 }6162/* 计算出所有可能的结果 */63int colorPlan(int adj[][N])64 {65int i, c, cnt;66int color[N]={0};67for(i=0;i<N;i++)68 {69 color[i] = -1;70 }7172 c=1;i=0;cnt=0;73while(1)74 {75if((c=selcol(i, c, color, adj)) == 0)76 {77 i=backcol(i, color);78 c=color[i];79if(i<0)80 {81 printf("1\n");82return cnt;83 }84 }85else86 {87 color[i]=c;88 i++;89 c=1;90if(i==N)91 {92 printcol(color);93 cnt++;94 i=backcol(i-1, color);95 c=color[i];96if(i<0)97 {98 printf("2\n");99return cnt;100 }101 }102 }103 }104return0;105 }106107int main()108 {109int adj[][N]={110 {1,1,0,1,1,0,0,0,0,0}, {1,1,1,0,1,0,0,0,0,0}, 111 {0,1,1,0,1,1,0,0,0,1}, {1,0,0,1,1,0,1,1,0,0}, 112 {1,1,1,1,1,1,1,0,0,0}, {0,0,1,0,1,1,1,0,1,0}, 113 {0,0,0,1,1,1,1,1,1,0}, {0,0,0,1,0,0,1,1,1,0}, 114 {0,0,0,0,0,1,1,1,1,1}, {0,0,1,0,0,0,0,0,1,1} 115 };116 printf("共有%d种配⾊⽅案\n", colorPlan(adj)); 117return0;118 }编译:gcc mapcol.c -o mcolor⽅法不⼀定是最优的,不过可以⾃⼰慢慢优化。
地图着色实训报告.
目录1 课题需求描述 (2)2 总体功能与数据结构设计 (2)2.1总体功能结构 (2)2.2数据结构设计 (3)3 算法设计和程序设计 (3)3.1算法设计 (3)3.1.1回溯法 (3)3.1.2贪心法 (6)3.2程序设计 (6)3.2.1调用回溯法,并判断着色方案是否可行 (6)3.2.2调用贪心法,对地图进行着色,并测试当前方案是否可行 (8)3.2.3在着色方案可行的情况下,换一种颜色着色,找出所有可行方案 (9)3.2.4主菜单的设计 (10)3.2.5二级菜单的设计 (11)3.2.6对菜单的使用及对算法用时的计时 (11)4 调试与测试 (14)5 设计总结 (17)5.1收获 (17)5.2存在问题 (18)6参考文献 (19)1 课题需求描述1.1地图着色问题设计要求:已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少地图着色问题是一个抽象的图形学问题,用程序实现对各个区域进行着色,并且相邻省所用的颜色不同,同时保证颜色的总数最少,如何将程序所需要的功能模拟着色在计算机中编程实现。
地图可以抽象为一个图,可以用邻接矩阵来进行模拟:对于每一个地图,我们可以把每一个区看作一个点,而区与区之间的邻接关系看作点与点之间的连线。
从而将地图抽象为一个图,然后就可以用邻接矩阵抽象。
相应的顶点为0,则表示两点邻接,否则,就不邻接,为1。
该程序用两种方法进行着色,分别是回溯法和贪心法。
2 总体功能与数据结构设计由于中国的省份较多,各省连接关系太多,所以程序只给出简单的测试数据,来测试该程序的功能。
程序对给定的程序进行着色,做到最多只用四种颜色进行着色,使得相邻省的颜色不同,并且将所有的着色可能都例举出来了。
对于地图得到着色,我用了两种算法,分别是回溯法和贪心法。
并且对他们的执行进行计时,比较他们的时间复杂度。
主要叙述:本课题设计的总体功能结构、数据结构设计。
2.1总体功能结构2.2数据结构设计void menu(); //主菜单void menu2(); //菜单用于选择算法void aboutjx(); //关于地图的说明void ljjz() //输出地图的邻接矩阵void huisu(int n,int m,int c[][12]) //调用回溯算法着色void tx(int map[N][N],int sum,int current) //调用贪心法着色int main() //输出主菜单,选择执行过程,对程序的调用3 算法设计和程序设计3.1算法设计3.1.1回溯法本程序采用回溯法进行着色。
c地图着色课程设计
c 地图着色课程设计一、教学目标本课程的目标是让学生掌握地图着色的基本概念和方法,能够运用所学的知识独立完成地图的着色任务。
具体的教学目标如下:知识目标:学生能够理解地图着色的概念、意义和应用;掌握地图着色的基本原则和方法。
技能目标:学生能够熟练运用地图着色工具,独立完成地图的着色任务;能够分析地图着色的效果,提出改进意见。
情感态度价值观目标:学生能够认识到地图着色在地理学和实际生活中的重要性,培养对地图着色的兴趣和热情。
二、教学内容本课程的教学内容主要包括地图着色的概念、原则和方法。
具体的教学内容如下:1.地图着色的概念:介绍地图着色的定义、意义和作用,让学生了解地图着色在地理学和相关领域中的应用。
2.地图着色的原则:讲解地图着色的基本原则,如区域性原则、渐变性原则、突出性原则等,让学生掌握地图着色的基本规律。
3.地图着色的方法:介绍常见的地图着色方法,如单一色系着色、渐变色系着色、符号着色等,让学生学会如何进行地图着色。
三、教学方法为了达到本课程的教学目标,我们将采用以下教学方法:1.讲授法:通过讲解地图着色的概念、原则和方法,让学生掌握地图着色的基本知识。
2.案例分析法:通过分析典型的地图着色案例,让学生学会如何运用地图着色方法解决实际问题。
3.实验法:让学生亲自动手进行地图着色实验,培养学生的动手能力和实际操作技能。
四、教学资源为了支持本课程的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:选择适合本课程的教材,为学生提供系统的地图着色知识。
2.参考书:提供相关的参考书籍,为学生提供更多的学习资料。
3.多媒体资料:制作课件、视频等多媒体资料,为学生提供直观的学习体验。
4.实验设备:准备地图着色的实验设备,如地图、着色工具等,为学生提供实际操作的机会。
五、教学评估为了全面、客观地评估学生在地图着色课程中的学习成果,我们将采用以下评估方式:1.平时表现:通过学生在课堂上的参与度、提问回答、小组讨论等表现,评估其对地图着色知识的掌握和应用能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计地图着色课程设计名称:课程设计专业班级:学生姓名:学号:指导教师:课程设计时间:计算机专业课程设计任务书目录1 需求分析 (4)2 概要设计 (4)3详细设计 (5)4 运行环境 (6)5开发环境 (6)6 程序设计.............................................................................................6~97 调试分析........................................................................................9~108 测试结果 (10)9参考文献 (11)10心得体会 (11)11成绩评价表 (12)a) 1需求分析A 已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少;B 将各省进行编号,然后利用无向图个顶点之间的边来表示各省的相邻关系;C 演示程序以用户和计算机的对话方式进行;D 最后对结果做出简单分析。
b ) 2概要设计:i 画程序整体结构图ii 分配函数功能功能模块的划分及模块间调用关系typedef struct //定义图{vextype vexs[MAXedg]; //存放边的矩阵adjtype arcs[MAXedg][MAXedg]; //图的邻接矩阵int vnum,arcnum; //图的顶点数和边数}Graph;C) 3详细设计i ) 主要功能模块的算法思想及其步骤着色模块:int colorsame(int s,Graph G)//判断这个颜色能不能满足要求{int i,flag=0;for(i=1;i<=s-1;i++)//分别与前面已经着色的几块比较if(G.arcs[i][s]==1&&color[i]==color[s]){flag=1;break;}return flag;void output(Graph G)//输出函数{int i;for(i=1;i<=G.vnum;i++)printf("%d ",color[i]);printf("\n");}void trycolor(int s,Graph G)//s为开始图色的顶点{int i;if(s>G.vnum)//递归出口{output(G);exit(1);}else{for(i=1;i<=N;i++)//对每一种色彩逐个测试{color[s]=i;if(colorsame(s,G)==0)trycolor(s+1,G);//进行下一块的着色}}}d) 4 运行环境i 软件环境操作系统:Windows8ii 硬件环境处理器:Intel Pentium 166MX内存:32MB硬盘空间:1GB显卡:SVGAE) 5 开发环境I 编程环境:Dev-C++ 5.0 beta 9.2 (4.9.9.2)Ii 编程语言:C语言,ANSI C89。
f) 6 程序设计#include <stdio.h>#include <stdlib.h>#define MAXedg 100#define MAX 0#define N 4 //着色的颜色数int color[30]={0};//来存储对应块的对应颜色typedef char vextype;typedef int adjtype;typedef struct //定义图{vextype vexs[MAXedg]; //存放边的矩阵adjtype arcs[MAXedg][MAXedg]; //图的邻接矩阵int vnum,arcnum; //图的顶点数和边数}Graph;//*********************************************************** int LocateVex(Graph G,char u){int i;for(i=1;i<=G.vnum;i++){if(u==G.vexs[i])return i;}if(i==G.vnum){printf("Error u!\n");exit(1);}return 0;}//**********************************************************void CreateGraph(Graph &G) //输入图{int i,j,k, w;vextype v1,v2;printf("输入图的顶点数和边数:\n");scanf("%d%d",&G.vnum,&G.arcnum);getchar();printf("输入图的各顶点:\n");for(i=1;i<=G.vnum;i++){scanf("%c",&G.vexs[i]);getchar();}for(i=0;i<=G.vnum;i++)for(j=0;j<=G.vnum;j++)G.arcs[i][j]=MAX;printf("输入边的两个顶点和权值(均用1表示):\n");for(k=0;k<G.arcnum;k++){scanf("%c", &v1);getchar();scanf("%c", &v2);getchar();scanf("%d", &w); getchar();i=LocateVex(G,v1);j=LocateVex(G,v2);G.arcs[i][j]=w;G.arcs[j][i]=w;}}//**************************************************************** void PrintGraph(Graph G) //输出图的信息{int i,j;printf("图的各顶点:\n");for(i=1;i<=G.vnum;i++)printf("%c ",G.vexs[i]);printf("\n");printf("图的邻接矩阵:\n");for(i=1;i<=G.vnum;i++){for(j=1;j<=G.vnum;j++)printf("%d ",G.arcs[i][j]);printf("\n");}}//****************************************************************** int colorsame(int s,Graph G)//判断这个颜色能不能满足要求{int i,flag=0;for(i=1;i<=s-1;i++)//分别与前面已经着色的几块比较if(G.arcs[i][s]==1&&color[i]==color[s]){flag=1;break;}return flag;}//****************************************************************** void output(Graph G)//输出函数{int i;for(i=1;i<=G.vnum;i++)printf("%d ",color[i]);printf("\n");}//****************************************************************** void trycolor(int s,Graph G)//s为开始图色的顶点,本算法从1开始{int i;if(s>G.vnum)//递归出口{output(G);exit(1);}else{for(i=1;i<=N;i++)//对每一种色彩逐个测试{color[s]=i;if(colorsame(s,G)==0)trycolor(s+1,G);//进行下一块的着色}}}//*****************************************************************int main(){Graph G;CreateGraph(G);PrintGraph(G);printf("着色方案:\n");trycolor(1,G);return 0;}G) 7 调试分析1.测试中的问题举例:在测试删除联系人函数时发现无论通讯录中现存多少条记录只要删除一条之后,通讯录就会被清空,经过检查发现是删除函数中的条件控制设置有错,导致只要一删除一个联系人就会事头结点与尾结点指向同一个,导致再显示联系人时显示无联系人。
经过调整已处理好。
2.算法改进设想举例:程序中还有很多地方不能很好的模拟通讯录的功能,比如在增肌联系人时,不管原来新联系人姓名是否已存在,都会被加入通讯录,这样一来就有可能重复记录。
此外在查找联系人时只要查找到一个合法记录就会中断查找操作,如此有可能导致记录的漏查。
结合以上两点应优化增加查找联系人算法,在存入之间进行防重判断。
H) 8 测试结果由于地图上各省连接关系太多,所以这里只给出简单的测试数据,来测试该程序的功能,如下:给出如下示意图,省份抽象为点,接壤抽象为有边相连。
顶点为:a b c d e f相邻边:a-b b-c b-e b-f c-d c-e c-f e-fI )参考文献[1]严蔚敏,《数据结构(C语言版)》清华大学出版社[2]谭浩强.《C语言程序设计》(第三版)清华大学出版社J )心得体会通过这次数据结构的课程设计,我更进一步的了解到了C语言对编程的基础性,与数据结构思想对于一个程序编码顺利进行的重要性。
c语言是程序的骨架,而数据结构和算法便是程序的思想,要成功的编写程序必须选择好合适的数据结构。
除此之外,我觉得比较重要的一点是在编复杂程序时要有宏观思想,要从整体把握设计好各个板块的调用关系,最好先做出一个流程图,再按照这个总体设想进一步具体、细化!这样才不会在需要调用其它函数时手忙脚乱!信息科学与工程学院课程设计成绩评价表课程名称:数据结构课程设计设计题目:地图着色专业:班级:姓名:学号:。