水管工遊戲 dfs的應用

2021-07-25 03:49:03 字數 1268 閱讀 2237

如圖只有兩種管道,求如何擺放讓管道從左上角到右下角連通?0代表樹木,1~6代表管道的不同擺放方式,為了程式處理方便,將進水口在左邊用1表示,上邊用2表示,右邊用3表示,下邊用4表示。

使用深度優先搜尋解決,先判斷當前管道的型別,然後根據進水口的方向,決定下乙個管道的位置和進水口的方向。使用棧儲存路徑。

#include 

#define n 5

#define m 4

int a[n][m] = ,,,

,,};int b[n][m] = ;

int flag = 0;

struct node

;struct node stack[100];

int top = 0;

void push(int x, int y)

struct node pop()

void print_a()

printf("\n");

}printf("\n");

}void print_b()

printf("\n");

}printf("\n");

}void print_s()

printf("\n");

}void dfs(int x, int y, int front)

if (x < 0 || x > n || y < 0 || y > m)

if (b[x][y] == 1)

b[x][y] = 1;

push(x, y); // 壓棧

if (a[x][y] >= 5 && a[x][y] <=6 )

if (front == 2)

if (front == 3)

if (front == 4)

}if (a[x][y] >= 1 && a[x][y] <= 4)

if (front == 2)

if (front == 3)

if (front == 4)

}b[x][y] = 0;

pop(); // 出棧

}int main()

else

return

0;}

為什麼dfs可以用遞迴的方式和棧的方式實現?

因為函式的呼叫也是通過棧的操作方式實現的,乙個函式被呼叫時將其壓棧,函式返回時出棧。

DFS 水管工遊戲

ac 今天來複習一下如何用dfs找到能使首尾連線的通道,並顯示出來。一塊矩形土地被分為n m的單位正方形,現在這塊土地上已經埋設有一些水管,水管將從座標為 1,1 的矩形土地的左上角座標邊緣,延伸到座標為 n,m 的矩形土地的右下角右部邊緣。水管有兩種,彎的和直的。每種管道將佔據乙個單位正方形土地。...

水管工遊戲 dfs

水管工遊戲是指如下圖中的矩陣中,一共有兩種管道,乙個是直的,乙個是彎的,所有管道都可以自由旋轉,最終就是要連通入水口可出水口。其中的樹為障礙物。方案 輸入格式 輸入的第一行為兩個整數n和 m 都不超過10 接下來的n行,每行有m個整數,表示地圖中的每一小格。其中0表示樹木,1 6分別表示管道的六種不...

水管工遊戲 dfs(遞迴)

這小節有點難,看不太懂可以跳過哦。最近小哼又迷上乙個叫做水管工的遊戲。遊戲的大致規則是這樣的。一塊矩形土地被分為n m的單位正方形,現在這塊土地上已經埋設有一些水管,水管將從座標為 1,1 左上角左部邊緣,延伸到 n,m 右下角右部邊緣。水管只有2種,如下圖所示。每種管道將佔據乙個單位正方形土地。你...