圖的遍歷演算法-七巧板塗色

許佳佳233發表於2016-06-11

有如圖所示的七巧板,試設計演算法,使用至多4種不同的顏色對七巧板進行塗色(每塊塗一種顏色),要求相鄰區域的顏色互不相同,列印輸出所有可能的塗色方案。



演算法設計:

1、使用鄰接矩陣表示七巧板的相鄰情況

2、使用蠻力法進行搜尋


最終結果:



程式碼:

#include <iostream>

using namespace std;

//三角板個數
const int n=7;
//鄰接矩陣表,用來判斷是否相鄰
const int data[n][n] =
{
    {0,1,0,0,1,0,1},
    {1,0,0,1,0,1,0},
    {0,0,0,0,1,0,1},
    {0,1,1,0,0,1,1},
    {1,0,0,0,0,0,1},
    {0,1,0,1,0,0,0},
    {1,0,1,1,1,0,0}
};
//每個三角板的顏色
int color[n]= {0,0,0,0,0,0,0};

static int total;
void tryFind(int s);//查詢塗色方案的遞迴
int colorSame(int s);//判斷與周圍的三角板顏色是否相同
void output();//輸出塗色方案

int main()
{
    total=0;
    tryFind(0);
    cout<<"Total= "<<total<<endl;
    return 0;
}

void tryFind(int s)
{
    //s=0~6,如果s=7說明已經塗完
    if(s==n)
        output();
    else
    {
        //1、2、3、4代表四種顏色
        //只有與周圍三角塊的顏色不同時才會進入下一個三角板的塗色
        for(int i=1; i<=4; i++)
        {
            color[s]=i;
            if(colorSame(s)==0)
                tryFind(s+1);
        }
    }
}

int colorSame(int s)
{
    int flag=0;
    for(int i=0; i<s; i++)
    {
        //使用鄰接矩陣判斷是否相鄰
        //如果相鄰判斷顏色是否相同
        if(data[i][s]==1 && color[i]==color[s])
            flag=1;
    }
    return flag;
}

void output()
{
    cout<<"serial number: ";
    for(int i=0; i<n; i++)
    {
        cout<<color[i]<<" ";
    }
    total++;
    cout<<endl;
}


相關文章