Ⅰ 地图着色问题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<iostream>
#include<map>
usingnamespacestd;
intmain(){
map<int,bool>map1,res_map,mapa,mapb;//res_map保存两个数组的不同元素
map<int,bool>::iteratorit;
inta[20],b[20];
intnum=0;
cin>>num;
for(inti=0;i<num;i++){
cin>>a[i];
mapa[a[i]]=true;
}
for(inti=0;i<num;i++){
cin>>b[i];
mapb[b[i]]=true;
}
intidx=0;
for(inti=0;i<num;i++){//去除a中的重复元素
if(mapa.find(a[i])==mapa.end()){
a[idx]=a[i];
idx++;
}
}
idx=0;
for(inti=0;i<num;i++){//去除b中的重复元素
if(mapb.find(b[i])==mapb.end()){
b[idx]=b[i];
idx++;
}
}
for(inti=0;i<num;i++){
map1[a[i]]=true;
}
for(inti=0;i<num;i++){//寻找两个数组的公共元素,并改慧保存在res_map中
it=map1.find(b[i]);
if(it!=map1.end()){
res_map[b[i]]=true;
}
}
inte=0;
boolis_first=true;
//按a中原始顺序,输出满足条件的元素
for(inte=0;e<mapa.size();e++){
if(res_map.find(a[e])==res_map.end()){
if(!is_first){
cout<<'';
}
cout<<a[e];
if(is_first)
is_first=false;
}
}
cout<<endl;
is_first=族歼渣true;
//按b中原始兆悄顺序,输出满足条件的b中的元素
for(inte=0;e<mapb.size();e++){
if(res_map.find(b[e])==res_map.end()){
if(!is_first){
cout<<'';
}
cout<<b[e];
if(is_first)
is_first=false;
}
}
cout<<endl;
intstop;
cin>>stop;
return0;
}
Ⅲ 四色问题C语言怎么解决
思路:建立数据结构,录入数据内容,遍历着色,输出第一个可行的着色方案。
下面就四个方面详细分析一下
首先分析数据结构:
对于地图,一个区块包含一个唯一编号数据(这个编号可以是地名,也可以是数字)用来区分该区块和其他区块的不同
另外要着色,还要考虑该区块和其他区块连接的情况
最后就是区块本身的颜色
通过上面的分析,即可建立如下数据结构:
structarea{
intnID;//这里以数字替代名称,作为地块的唯一标识
intnColor;//用1,2,3,4表示不同的颜色,用0表示还没有着色
area*pNei;//邻接的区块
intnNei;//邻接区块的数量
};
然后需要录入数据,这个请依据具体的地图进行处理,撰写相应的录入函数,填入上面的数据结构
假设录好的数据如下:
structareacity[64];//假设已经录制好了数据,初始所有城市颜色都为0
数据录好后,我们可以如下方式进行遍历,尝试着色
遍历分为个模块:一个是遍历模块,一个是校验模块
校验模块依序检查所有的城市和其邻接城市是否存在同色的情况,是则返回false,否则返回true
遍历模块则逐个城市进行上色尝试
可以考虑递归
下面给一个递归的示例:
检测模块:
boolisOk(){
for(inti=0;i<64;i++)//假设有64个城市,其初始值和城市关系已经录制完毕
{
for(intj=0;j<city[i].nNei;j++){
if(nColor==city[i].pNei[j].nColor)
returnfalse;
}
}
returntrue;
}
遍历递归模块:
booladdcity(intnIndex){
if(nIndex>=64)returntrue;//所有城市都着色了,则返回成功
for(inti=1;i<=4;i++){
city[nIndex].nColor=i;
if(isOk()){//本城市的颜色找到了
if(addcity(nIndex+1)==true){//找下一个城市的颜色
returntrue;
}else{//无法为下一个城市着色
continue;//更改本城市颜色
}
}
}
returnfalse;//没有一个颜色可行,返回上一级,重新寻找
}
调用的时候可以采用下面的方式:
if(addcity(0)==false){
printf("无法找到答案,四色定理错误! ");
}else{
printf("找到了答案,城市和着色结果如下: ");
for(inti=0;i<64;i++){
printf("city%03dcolor%d ",city[i].nID,city[i].nColor);
}
}
Ⅳ c语言画游戏地图
游戏地图的绘制不是单靠程序员就能做得了的。还要设计到很多美工方面的东西,就要靠平面设计师了。
c语言中相关图形的函数很丰富,做为制图是一门不错的语言。如果想学就专门找些c语言图形方面的资料来深入学习,下面只是举几个,在dos下的简单图形,毕竟turbo c的制图功能很有限。
——————————————————————————
1./*学用circle画圆形*/
#include "graphics.h"
main()
{int driver,mode,i;
float j=1,k=1;
driver=VGA;mode=VGAHI;
initgraph(&driver,&mode,"");
setbkcolor(YELLOW);
for(i=0;i<=25;i++)
{
setcolor(8);
circle(310,250,k);
k=k+j;
j=j+0.3;
}
getch();
}
2.//line画直线
#include "graphics.h"
main()
{int driver,mode,i;
float x0,y0,y1,x1;
float j=12,k;
driver=VGA;mode=VGAHI;
initgraph(&driver,&mode,"");
setbkcolor(GREEN);
x0=263;y0=263;y1=275;x1=275;
for(i=0;i<=18;i++)
{
setcolor(5);
line(x0,y0,x0,y1);
x0=x0-5;
y0=y0-5;
x1=x1+5;
y1=y1+5;
j=j+10;
}
x0=263;y1=275;y0=263;
for(i=0;i<=20;i++)
{
setcolor(5);
line(x0,y0,x0,y1);
x0=x0+5;
y0=y0+5;
y1=y1-5;
}
getch();
}
3.//用rectangle画方形
#include "graphics.h"
main()
{int x0,y0,y1,x1,driver,mode,i;
driver=VGA;mode=VGAHI;
initgraph(&driver,&mode,"");
setbkcolor(YELLOW);
x0=263;y0=263;y1=275;x1=275;
for(i=0;i<=18;i++)
{
setcolor(1);
rectangle(x0,y0,x1,y1);
x0=x0-5;
y0=y0-5;
x1=x1+5;
y1=y1+5;
}
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
outtextxy(150,40,"How beautiful it is!");
line(130,60,480,60);
setcolor(2);
circle(269,269,137);
}
…………………………
这里就不多说了,当然这些都是最最基本的东西。推荐几本不错的c图形编程的书给你吧。你可以参考一下:
《计算机图形学》清华影印版
《计算机真实感图形的算法基础》彭群生等着 科学出版社
还要综合考虑你所用的操作平台。e.g.unix平台下你可以找其他相关的资料。
Ⅳ c语言中自画图形如何填色
setfillstyle(int pattern, int color)//先用这个函数设置一下填充的模式
floodfill(int x, int y, int border)//再用这个函数填充就可以了。