深度優先搜索

1.算法說明算法

  [1]深度優先搜索主要基於棧來操做,即把初始節點沿着一條路徑直到終點入棧,而後再返回訪問分叉,沿着分叉直到終點入棧,以此反覆,因此使用遞歸比較方便。spa

2.例子code

例1: 有一長度爲N(1 <= N <= 10)的地板,給定兩種不一樣瓷磚:一種長度爲1,另外一種長度爲2,數目不限。要將這個長度爲N的地板鋪滿,一共有多少種不一樣的鋪法?

  代碼:blog

#include "stdlib.h"   
#include "stdio.h"  

int g_size;
int g_result = 0;

//used表示已經鋪上的大小
void dfs(int used)
{
    if (used > g_size)
        return;
    
    if (used == g_size){
        g_result++;
        return;
    }
    
    dfs(used + 1);
    dfs(used + 2);
     return ;
}

int main()
{
    printf("input size:");
    scanf("%d", &g_size);

    dfs(0);

    printf("result:%d\n", g_result);
    return 0;
}

   

例2:如圖所示六角形中,填入1~12的數字,使得每條直線上的數字之和都相同。圖中已經填好了3個數字,請計算星號位置所表明的數字是多少?

  

  代碼:遞歸

#include <stdio.h> 

int g_array[13] = {0};
int g_value[13] = {0};

// 參數x是當前要填充的位置
void dfs(int x)
{
    int i, b[6];

    //若是當前是一、二、12位置,由於已經填充,因此直接填充下一個位置
    if(x==1 || x==2 || x==12){
        dfs(x+1);
        return;
    }

    // 填充完一個組合
    if(x == 13){        
        b[0] = g_array[1]+g_array[3]+g_array[6]+g_array[8]; 
        b[1] = g_array[1]+g_array[4]+g_array[7]+g_array[11];
        b[2] = g_array[2]+g_array[3]+g_array[4]+g_array[5];
        b[3] = g_array[2]+g_array[6]+g_array[9]+g_array[12];
        b[4] = g_array[5]+g_array[7]+g_array[10]+g_array[12];
        b[5] = g_array[8]+g_array[9]+g_array[10]+g_array[11];
        
        for(i=1; i<6; i++){
            if(b[i] != b[i-1]){
                break;
            }
        }

        if(i == 6)
            printf("result:%d\n", g_array[6]); 
    }
        
    for(i=1;i<13;i++){
        if(g_value[i]==0){    
            g_value[i] = 1;    

            //填充一個位置後,遞歸嘗試後面的全部組合
            g_array[x] = i; 
            dfs(x+1);
            g_value[i] = 0;    
        }        
    }
}

int main()
{
    int i;
    g_array[1] = 1;
    g_array[2] = 8;
    g_array[12] = 3;
    g_value[1] = 1;
    g_value[8] = 1;
    g_value[3] = 1;
    dfs(1);       
    return 0;
}
相關文章
相關標籤/搜索