日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言电子地图程序,地图四色着图的C语言实现

發布時間:2024/1/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言电子地图程序,地图四色着图的C语言实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

四色問題又稱四色猜想、四色定理,是世界三大數學猜想之一。四色定理是一個著名的數學定理,通俗的說法是:每個平面地圖都可以只用四種顏色來染色,而且沒有兩個鄰接的區域顏色相同。1976年借助電子計算機證明了四色問題,問題也終于成為定理,這是第一個借助計算機證明的定理。(這段文字來源于百度百科)

這篇文章主要介紹利用C語言實現地圖四色著圖。主要包括:設計的數據結構;算法實現等。

1 著圖的數據結構

著圖時無需表示具體的地圖多邊形,只需要表示多邊形的Voronoi圖即可,說的簡單點可見下圖:

對于左邊的地圖多邊形,在算法中只需要表示成圖形右邊的即可。其中結點(v1, v2…)表示的是地圖多邊形,結點的連線表示兩個多邊形之間是比鄰的關系。

因此在數據結構中只需要表示成圖的形式即可。這里采用“鄰接表”的數據結構,如下:

#include

#include

#include

#define MAX_VERTEX_NUM 20

typedef struct ArcNode {

int adjvex; //該邊指向的頂點的位置

struct ArcNode *nextarc; //指向下一條邊的指針

} ArcNode, *ArcNList;

typedef struct {

float x;

float y;

} Vertex; //點

typedef struct VNode {

Vertex data; //頂點信息

ArcNList firstarc; //指向第一條依附該頂點的邊的指針

int color; //該點的顏色

} VNode, AdjList[MAX_VERTEX_NUM];

typedef struct{

AdjList vertics;

int vexnum, arcnum; //該圖的當前頂點數和邊數

} UDGraph;

2 著圖的算法

著色的算法采用回溯法。基本思路為:首先對一個多邊形進行著色,著色后判斷是否滿足要求,如果滿足要求則繼續對其他多邊形進行著色;如果不滿足要求則撤銷當前著色并回溯,采用其他著色方案。遞歸如此,直到地圖全部著色完成。

地圖四色染圖的C語言代碼實現如下。其首先給定地圖最多使用的顏色數量為4,判斷能否只利用4種顏色對地圖進行著色,如果能則返回true,反之則返回false。

bool isColorOK(UDGraph G, int node) { //判斷對第node個結點著色的方案行不行

VNode V = G.vertics[node - 1];

ArcNList T = V.firstarc;

while(T) {

if(V.color == G.vertics[T->adjvex].color) return false;

T = T->nextarc;

}

return true;

}

bool getColorPowset(UDGraph &G, int color_Num, int step, int a, int b) { //**回溯法對圖著色

if(step > G.vexnum) {

if(G.vertics[a-1].color == b) { //在a區域圖上了b色

return true;

}

} else {

int i;

for(i=1; i<=color_Num; i++) {

G.vertics[step - 1].color = i;

if(isColorOK(G, step)) {

if(getColorPowset(G, color_Num, step + 1, a, b)) return true;

}

G.vertics[step - 1].color = 0;

}

}

return false;

}

3 測試運行

測試過程的代碼包括:建圖的過程、輸出著色結果的過程。這兩個過程的代碼如下:

int createUDGraph(UDGraph &G) {

int a, b, i;

ArcNList p;

printf("請輸入結點的個數和邊的個數:");

scanf("%d,%d", &(G.vexnum), &(G.arcnum));

getchar(); //消除回車

for(i=0; i

G.vertics[i].firstarc =NULL;

G.vertics[i].color = 0;

}

printf("請輸入這%d個點之間的拓撲關系:\n", G.vexnum);

//接下來就是創建這G.arcnum*2個邊

for(i=1; i<=G.arcnum; i++) {

scanf("%d,%d", &a, &b); //表明a點和b點之間向鄰接,在a點和b點之間連上線

getchar();//消除回車

p = (ArcNList)malloc(sizeof(ArcNode)); if(!p) exit(-2);

p->adjvex = b - 1;

p->nextarc = G.vertics[a - 1].firstarc;

G.vertics[a - 1].firstarc = p;

//以上是在a點上加上一個結點,一下是在b點上加上一個結點

p = (ArcNList)malloc(sizeof(ArcNode)); if(!p) exit(-2);

p->adjvex = a - 1;

p->nextarc = G.vertics[b - 1].firstarc;

G.vertics[b - 1].firstarc = p;

}

return 1;

}

void outputGraph(UDGraph G) {

int i;

for(i=0; i

}

int main() {

int a, b;//a區域圖b色

UDGraph G;

createUDGraph(G);

printf("請輸入一種著色方案(即哪一個區域著什么顏色):");

scanf("%d,%d", &a, &b);//在a區域圖上b色

getchar();//消除回車

if(getColorPowset(G, 4, 1, a, b)) {//如果最后的圖色成功

printf("圖形圖色成功,為:\n");

outputGraph(G);

} else printf("圖形圖色失敗,方案不正確\n");//如果最后的圖色成功

return 1;

}

運行上述代碼,測試如下:

其圖形含義如下:

如果想自己編譯運行,只需要將本文所有的代碼拷貝到一起即可編譯運行。

全文完。轉載請注明出處。

總結

以上是生活随笔為你收集整理的c语言电子地图程序,地图四色着图的C语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。