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; }