A. 求我描述的地圖填色問題詳解(100分,只求詳盡)
最少填色數量,這個似乎不用證明了吧.最少4色.
以下是李寬證明法:
證明:
首先進行抽象處理:有顏色點表示地區,連線表示相鄰及版圖走向。
因為地圖為平面,地區版圖不可相疊覆蓋。
所以連線不能交叉。
因為連線兩端顏色不同。
所以兩兩相連的幾個點顏色各不相同。
所以N個點兩兩相連共需N種顏色。
至此,四色問題轉化為:在連線不允許交叉的前提下,最多有4個點可實現兩兩相連。也就是說,不可能有更多點兩兩相連,也就不可能出現更多色。
點數為1、2、3時均成立。由於線的形狀,點的位置不影響相鄰關系,故點數為3時兩兩相連可畫成三角形。點數為4時,最終均可化為三角形內含有一點且該點與三頂點分別相連的形式。即有一點被三點封閉。
點數為5時,容易發現,無論第五點放在平面什麼位置,都無法實現5個點在連線不交叉的前提下兩兩相連。(關鍵)
因為連線過程是遞進的。即必然先滿足三點兩兩相連,後滿足四點兩兩相連,隨後第五點。而已知第五點連線失敗,點數更多也就不可能實現了。
環狀地區,可抽象為環。環本身是封閉的。相對於環外點和環,環可視為點。在環內加點連線,最終可形成封閉區
點和環均定義為元素,欲用最少色塗最多元素,同時欲用更多色,必產生封閉區域。再用元素最少情況下,三點三線、一點一環兩線、兩點外一環三線為三種情況。在此基礎上加點,最多四元素兩兩相連,最多為3+1=4色。(易操作)
無論多少元素建立連線,都不會出現多於四點兩兩相連情況。故最多四色。
由此,四色問題證畢。
B. 關於C語言編程問題
#include <stdio.h>
void main()
{
char box[5];
int i;
printf("********************************\n");
printf("* 放球問題 *\n");
printf("********************************\n");
// a:紅 b:黃 c:黑 d:白
for(box[1]='a';box[1]<='d';box[1]++)
for(box[2]='a';box[2]<='d';box[2]++)
{
if (box[1]!=box[2])
for(box[3]='a';box[3]<='d';box[3]++)
{
if(box[1]!=box[3]&&box[2]!=box[3])
for(box[4]='a';box[4]<='d';box[4]++)
{
if(box[1]!=box[4]&&box[2]!=box[4]&&box[3]!=box[4])
if ( (box[1]=='c'&&box[2]!='b' || box[1]!='c'&&box[2]=='b')
&& (box[2]=='c'&&box[3]!='d'||box[2]!='c'&&box[3]=='d')
&& (box[2]=='a'&&box[4]!='d'||box[2]!='a'&&box[4]=='d')
)
for(i=1;i<5;i++)
switch(box[i])
{
case 'a': printf("box[%d]=red ball\n",i);break;
case'b': printf("box[%d]=yellow ball\n",i);break;
case 'c': printf("box[%d]=black ball\n",i);break;
case 'd': printf("box[%d]=white ball\n",i);break;
}
}
}
}
}
C. C語言編程地圖著色
書上有嘛
D. 四色問題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);
}
}
E. 地圖著色問題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]);
}
說是人性化著色,其實還有一個問題沒有考慮,那就是操作員跳躍式著色,就像大家玩「掃雷」游戲一樣。其實也容易實現,可以像定義選色順序一樣定義著色順序。
F. 四色問題C語言怎麼解決
圖論的面著色問題。
首先是要輸入一個圖。地圖中的每一個區域在圖中成為一個頂點(Vertex),兩個區域相鄰在圖中表示為兩個頂點之間的一條邊(Edge)。
這個要怎麼輸入呢?測試的時候可以先在代碼里直接內置圖的結構,要用戶輸入的話那就是UI的問題了。
輸入完成以後,程序的內存里就有一張無向圖了,圖的表示方法,簡單的可以用鄰接矩陣來表示。
至於演算法,一個比較簡單的是深度優先搜索。
比如總共有10個頂點,那麼至多有4^10種著色方案。
從(c1,
c1,
c1,
c1,
c1,
c1,
c1,
c1,
c1,
c1)到(c4,
c4,
c4,
c4,
c4,
c4,
c4,
c4,
c4,
c4)逐一判斷即可。判斷的過程中可以加入剪枝操作以提高效率。
比如(c1,
c1,
...)這個方案在確定了2個頂點的顏色後已經矛盾了,那麼就直接把後面的剪掉,從(c1,
c2,
...)開始搜索
G. C語言做四色問題要代碼
//線性地區的方案
#include<stdio.h>
intn=0;
intmain()
{
printf(「輸入n的值=」);
scanf("%d",&n);
printf(" ");
inti=0;
inta=rand()%3+1;
intb=0;
for(i=0;i<n;i++)
{
printf("地區%d=%d ",i+1,a);
while(1)
{
b=rand()%3+1;
if(b!=a)
{
a=b;
break;
}
}
}
return0;
}