?? 地圖著色原理c語言程序實現.txt
字號:
地圖著色算法C語言實現[原創]
定理:任何平面地圖可以使用4種顏色給每個不同的城市著色,而保證相鄰的城市著不同的顏色。
思路:把地圖上的每個城市抽象為一個點,并給每個城市編號,,相鄰的城市之間用直線連接。據此做出鄰接矩陣,若第i個城市與第j個城市相鄰,則metro[i][j]=1,否則metro[i][j]=0。
算法:按照編號從小到大的順序檢查每個城市,對每個城市從1到4使用4種顏色著色,若當前顏色可用(即不與相鄰城市顏色相同),則著色;否則測試下一種顏色。
程序:
#i nclude <stdio.h>
#define N 21
int ok(int metro[N][N],int r_color[N],int current)
{/*測試當前著色方案是否可行*/
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 main()
{
int r_color[N]={0};
int i;
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}};
go(metro,r_color,20,1);
printf("\n");
for(i=1;i<=20;i++)/*輸出著色方案*/
printf("%3d",r_color[i]);
}
中午吃飯時,想了一下,把上面程序中的go函數和ok函數合并一下,并且不使用遞歸,于是寫下了下面color函數的代碼,main函數不變,但調用方式變為color(metro,r_color,20);請朋友多批評
void color(int metro[N][N],int r_color[N],int sum)
{
int i,j,k;
for(i=1;i<=sum;i++)/*檢查所有城市*/
for(j=1;j<=4;j++)/*對每個城市嘗試4種顏色的著色方案*/
{
r_color[i]=j;/*嘗試著色*/
for(k=1;k<i;k++)/*檢查是否與相鄰城市顏色相同*/
if(metro[i][k]==1&&r_color[k]==r_color[i])
break;/*相同則跳出,此時有k<i,則下面條件不成立,繼續嘗試下一種顏色*/
if(k>=i)/*若不相同,則使用當前顏色,并檢查下一個城市*/
break;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -