当前位置:首页 » 编程语言 » c语言中染色问题
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言中染色问题

发布时间: 2022-05-07 09:16:50

① 地图着色问题C/C++

从一个省开始,给它涂上任意一种颜色1,遍历它旁边的省份,涂上与已经涂色并于他相邻的省份不同的颜色就行了。
理论上4种颜色就够了.地图的四色问题嘛!
可能会有多组解。用递归(dfs)就可以输出所有解了。

地图着色算法c语言源代码
前面我写了一个地图着色(即四色原理)的C源代码。

写完以后想了一下,感觉还不完善,因为从实际操作的角度来考虑,四种可用的颜色放在旁边,不同的人可能会有不同的选择顺序,另外,不同的人可能会选择不同的城市作为着色的起点,而当时的程序没有考虑这个问题。于是,把程序修改为下面的样子,还请同行分析并指出代码中的不足之处:

#i nclude <stdio.h>
#define N 21
int 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;
else
for(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语言)

咯咯
排列组合问题

数学思想
转化为
编程代码
即可
//以下为程序代码 参考
#include<stdio.h>
#include <string.h>
#include <malloc.h>
void main()
{
int front,rear,temp,n,m,i,j,k,l,group,pre,result[100],newer[100],r[100][100]={0};/*front为队列当前元素在队列中的序号,rear为队尾元素在队列中的序号,temp为当前 元素在direction中的序号,group为组号,pre为前一出列元素在direction中的序号。 */
char **direction,*p1,*p2;//direction为方向集合。
printf("请输入可以通行的方向的个数:\n");
scanf("%d",&n);
printf("请输入各个方向:\n");
direction=(char **)malloc(2*n*n);
for(i=0;i<n;i++)
{
*(direction+i)=(char *)malloc(2);
scanf("%s",*(direction+i));
}
printf("请输入不能同时通行的两个方向的个数:\n");
scanf("%d",&m);
printf("请输入各个方向:\n");
for(i=0;i<m;i++)
{
p1=(char*)malloc(2);
p2=(char*)malloc(2);
scanf("%s%s",p1,p2);
k=-1;
l=-1;
for(j=0;j<n;j++)
{
if(!strcmp(*(direction+j),p1))
k=j;
if(!strcmp(*(direction+j),p2))
l=j;
if(k>=0&&l>=0)
break;
}
free(p1);
free(p2);
r[k][l]=1;
r[l][k]=1;
}
front=n-1;
rear=n-1;
for(i=0;i<n;i++)
{
*(newer+i)=0;
}
group=1;
pre=0;
do
{
front++;
if(front==rear+1)
front=0;
for(i=0;i<n;i++)
{
if(!strcmp(*(direction+i),*(direction+front)))
{
temp=i;
break;
}
}
if(temp<pre)
{group++;
*(result+temp)=group;
for(i=0;i<n;i++)
{
*(newer+i)=r[temp][i];
}
}
else if(*(newer+temp)!=0)
{
rear++;
if(front==rear)
{
for(i=n;i<n+rear;i++)
free(*(direction+i));
rear=0;
}
else
*(direction+rear)=(char *)malloc(2);
*(direction+rear)=*(direction+temp);
}
else
{
*(result+temp)=group;
for(i=0;i<n;i++)
*(newer+i)=*(newer+i)+r[temp][i];
}
pre=temp;
}while(front!=rear);
printf("所需要的信号灯数目为%d个\n",group);
for(i=1;i<group+1;i++)
{
printf("%d ",i);
for(j=0;j<n;j++)
{
if(*(result+j)==i)
printf("%s ",*(direction+j));
}
printf("\n");
}
free(direction);
}
//调试成功!

③ 请教一个C语言问题:setcolor(int color)中的color值是不是可以越界啊它是怎么处理超过maxcolor的

通常系统函数对这种处理是采用取短方式。
这里,你说最大color值为15。那么,系统函数的处理如下:
void setcolor(int color)
{
color &= 0x0f;
……
}
这样以来,不管你的color的值为多少,都可以被限制在0~15之间。
对于其它的形参范围,系统函数并不是一出错就不工作。它可能是会在出错的情况下,按默认参数执行。

④ 数据结构C语言 四染色定理

下面是用的c++描述的:涉及到类的有关知识。你不知道的话我可以帮你改为c语言描述。不过需要时间(这个星期之内),我最近比较的忙。反正你加了分,你就慢慢等吧!不好意思,我最近太忙了,没时间给你改。再加点分让别人给你回复吧!
class color{
friend int mcoloring(int,int,int * *);
private:
bool OK(int k);
void Backtrack(int t);
int n,//图的定点数
m,//可用颜色数
**a,//图的临接矩阵
*x;//当前解
long sum;//当前已找到的可m着色方案数
};
bool color::OK(int k)
{ //检查颜色的可用性
for(int j=1;j<=n;j++)
if((a[k][j]==1)&&(x[j]==x[k]))return false;
return true ;
}
void color::Backtrack(int t)
{
if(t>n){
sum++;
for(int i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;
}
else for(int i=1;i<=m;i++)
{ x[t]=i;
if(OK(t))Backtrck(t+1);
x[t]=0;
}
}
int mcoloring (int n,int m,int **a)
{color X;
//初始化
X.n=n;
X.m=m;
X.a=a;
X.sum=0;
int *p=new int [n+1];
for(int i=0;i<=n;i++)
p[i]=0;
X.x=p;
X.Backtrack(1);
delete []p;
return X.sum;
}

⑤ C语言中更改背景和前景的颜色出了问题是什么情况

 是啊,你说的那几个函数只能是在tc里面才有定义的,但是如果是在C++中就需要使用GDI中CDC类,函数SetTextColor函数是设置文本前景色,SetBKColor是设置背景色,TextOut为输出文本.例:在窗口左上角输出计算机三个字,蓝底白字:void CGraphicView::OnDraw(CDC *pDC){CGraphicDoc* pDoc=GetDocument();ASSERT_VALID(pDoc);pDC->SetTextColor(RGB(255,255,255));pDC->SetBkColor(RGB(0,0,255));pDC->TextOut(0,0,"计算机");}展开全部

87%的人还搜了

⑥ C语言编程地图着色

书上有嘛

⑦ C语言中fabs问题

要包含头文件:
#include <math.h>
求绝对值函数fabs 定义在 math.h 里。
或自己计算绝对值: if (a < 0) b= -a; else b=a;

⑧ C语言有处理图像和颜色的函数吗除了TC的GRAPHICS.H里边的

borland c++ v3.1也有
里面用bc.exe(别用bcw.exe,bcw是图形界面,不能直接用graphic)
# include <graphics.h>即可(graphics.h必须在9x系统上运行,不支持xp)
borland c++ v3.1虽然有点老,而且是16位的,但绝对是一流的编译器,应有尽有,无论代码缩进,染色,语法判断,调试,甚至编译出的exe大小比dev-c++都好
而且borland c++ v3.1也支持windows.h

graphics.h必须在9x系统上运行,不支持xp
这个可能是系统不同了,在我家根本不行,说ntvdm cpu遇到无效指令
你家的xp或者显卡可能和我家的有点不同

⑨ C语言中基本的几种算法有哪些越多越好!就像打擂台算法'冒泡排序法等等...

排序算法
冒泡排序
选择排序
快速排序
高精度运算
存储方法
加法运算
减法运算
乘法运算
扩大进制数
习题与练习
搜索算法
枚举算法
深度优先搜索
广度优先搜索
8数码问题
n皇后问题
搜索算法习题
枚举法习题
聪明的打字员
量水问题
染色问题
跳马问题
算24点
图论算法
最小生成树算法(Prim算法)
单源最短路径算法(Dijkstra算法)
任意结点最短路径算法(Floyd算法)
求有向带权图的所有环
Bellman-Ford算法
计算图的连通性
计算最佳连通分支
计算拓扑序列
图论算法习题
网络建设问题
最短变换问题
挖地雷
乌托邦城市
乌托邦交通中心
动态规划
最短路径问题
动态规划概念
骑士游历问题
最长递增子序列
合唱队形
石子合并问题
能量项链
0/1背包问题
开心的金明
金明的预算方案
加分二叉树
字串编辑距离
花瓶插花
凸多边形三角划分
快餐店