1. 程式人生 > >用棧實現四種顏色對地圖的染色

用棧實現四種顏色對地圖的染色

        數學上有個四色原理,對一個地圖而言,可以用四種顏色將地圖染色而且相鄰兩個國家顏色不同,下面使用C語言實現對一個簡單地圖的染色。程式碼如下:

#include <stdio.h>

char map[7][7]={-1,1,1,1,1,1,0,
                1,-1,0,0,0,1,0,
                1,0,-1,1,1,0,1,
                1,0,1,-1,1,0,0,
                1,0,1,1,-1,1,0,
                1,1,0,0,1,-1,0,
                0,0,0,0,0,0,-1,
               };                   //初始化地圖,map[i][j]=1表示第i+1,和j+1塊相連,0表示不相連,-1表示無意義

typedef struct _stack
{
    int i;
    char a[7];
}stack;
/*實現用4種顏色染色,要求相鄰的塊不同用同種顏色,下面 1 表示紫色 2表示黃色
  3表示紅色,4表示綠色,每個區域按照上面四種顏色的順序進行染色,先暫定第一塊的
  顏色為 1 ,對於後面,先尋找一個與前面相鄰塊不同的顏色,入棧,如果沒找到,將棧頂
  顏色出棧,如果前面已經是 4 顏色,繼續退棧,否則當前顏色值上調,壓入棧
  由於和前面相鄰節點比較是會破壞棧的封裝性,所以沒寫出它的操作,下面只是模擬了棧先進後出的性質而已而已*/
void dye()
{
    stack s;
    int i=0,j,k,cur,t;
    char color,flag,flag_2=0;    //flag_2檢測前面是否退棧,即是否向前回溯
    s.i=-1;
    s.i+=1;
    s.a[i]=1;
    while(i<7)
    {
        t=1;
		if(flag_2)   //如果發生退棧,這樣原來不是棧頂元素成為棧頂,顏色值增加
        {
        	t=s.a[i]+1;
        }
		for(j=t;j<=4;j++)
        {
            flag=1;
            for(k=0;k<=i;k++)
            {
                if(map[i+1][k]==1&&j==s.a[k])   //相鄰而且j顏色已經在與其相鄰的塊的被使用
                {
                    flag=0;
                    break;
                }
            }
            if(flag)   //找到合適的顏色與相鄰快顏色都不相同,將該顏色入棧
            {
                color=j;
                s.i+=1;
                i=s.i;
                s.a[i]=color;
                break;
            }
        }
        flag_2=0;

        if(j>4)   //沒有找到合適的顏色,退棧
        {
            s.i-=1;
            i=s.i;
            flag_2=1;
            while(s.a[i]==4)  //前面的一個塊也已經4種顏色都嘗試,繼續退棧
            {
                s.i-=1;
                i=s.i;
            }
            if(i==-1)   //如果棧空,表示找不到一種塗色方案
            {
                printf("can't find any solution!\n");
                return ;
            }
        }
    }
    for(j=0;j<7;j++)
    {
        char ch=s.a[j];
        printf("%d:",j+1);
        switch(ch)
        {
        case 1:
        {
            printf("purple\n");
            break;
        }
        case 2:
        {
            printf("yellow\n");
            break;
        }
        case 3:
        {
            printf("red\n");
            break;
        }
        case 4:
        {
            printf("green\n");
            break;
        }
        }
    }
}

int main()
{
	dye();
	return 0;
}

執行結果如下: