DFS 水管工遊戲

2021-10-23 15:08:18 字數 1789 閱讀 5726

ac**

今天來複習一下如何用dfs找到能使首尾連線的通道,並顯示出來。

一塊矩形土地被分為n*m的單位正方形,現在這塊土地上已經埋設有一些水管,水管將從座標為(1,1)的矩形土地的左上角座標邊緣,延伸到座標為(n,m)的矩形土地的右下角右部邊緣。水管有兩種,彎的和直的。

每種管道將佔據乙個單位正方形土地。你現在可以旋轉這些管道,使其構成乙個管道系統,即創造一條從(1,1)到(n,m)的連通管道。標有數目的方格表示這裡沒有管道。

輸入的第一行為兩個整數n,m(都不超過10),接下來的n行,每行有m個整數,表示地圖中的每一小格。其中0表示數目,1~6分別表示管道的六種不同擺放方式

如果通過旋轉管道可以使之構成乙個連通的管道系統,就輸出鋪設的路徑,否則輸出impossible。

5 4

5 3 5 3

1 5 3 0

2 3 5 1

6 1 1 5

1 5 5 4

(1,1) (1,2) (2,2) (3,2) (3,3) (3,4) (4,4) (5,4)

5 4

3 5 2 4

1 3 2 5

2 5 3 1

2 6 1 4

2 5 4 5

impossible

#include

using namespace std;

int book[51]

[51],a[51]

[51];

int next[5]

[2]=

,,,,

};int top;

int n,m,flag;

//flag 用來標記

struct notes[

2501];

//用棧來儲存路徑

void

dfs(

int x,

int y,

int t)

if(x<

1||x>n||y<

1||y>m)

return

;//防止越界

if(book[x]

[y]==1)

return

;//如果已經走過

book[x]

[y]=1;

//走過的路徑標記下

top++

;//入棧操作

s[top]

.x=x;

s[top]

.y=y;

if(a[x]

[y]>=

5&&a[x]

[y]<=6)

if(t==2)

if(t==3)

if(t==4)

}if(a[x]

[y]>=

1&&a[x]

[y]<=4)

if(t==2)

if(t==3)

if(t==4)

} book[x]

[y]=0;

//回溯

top--;}

intmain()

}dfs(1

,1,1

);if(

!flag)

printf

("impossible");

//如果flag沒有被標記,說明沒有路徑,輸出impossible

return0;

}

好啦,解題完畢!!!!

水管工遊戲 dfs

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

水管工遊戲 dfs(遞迴)

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

水管工遊戲 dfs的應用

如圖只有兩種管道,求如何擺放讓管道從左上角到右下角連通?0代表樹木,1 6代表管道的不同擺放方式,為了程式處理方便,將進水口在左邊用1表示,上邊用2表示,右邊用3表示,下邊用4表示。使用深度優先搜尋解決,先判斷當前管道的型別,然後根據進水口的方向,決定下乙個管道的位置和進水口的方向。使用棧儲存路徑。...