① 地圖著色問題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背包問題
開心的金明
金明的預算方案
加分二叉樹
字串編輯距離
花瓶插花
凸多邊形三角劃分
快餐店