水管工遊戲 dfs

2022-08-29 12:36:16 字數 1627 閱讀 2754

水管工遊戲是指如下圖中的矩陣中,一共有兩種管道,乙個是直的,乙個是彎的,所有管道都可以自由旋轉,最終就是要連通入水口可出水口。其中的樹為障礙物。

方案:

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

輸入: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)

本題使用的是深度優先搜尋演算法,先標識入水口方向,在每次探索新管道的時候上根據入水口方向進行擴充套件,然後根據管道的型別來判斷下乙個節點的入水口方向。水管入口:1代表左,2代表右,3代表上,4代表下。

#include#include

#define inf 10000000

using

namespace

std;

int n,m,flag=0

;int a[10][10],b[10][10

];int next[4][2]=,,,};

struct

node

s[100

];int top=0

;void dfs(int x,int y,int

r)

if(x<1||y<1||x>n||y>m)return

;

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

如果這個點已在路徑中

return

; b[x][y]=1;//

標記 top++;

s[top].x=x;

s[top].y=y;

//直水管的情況

if(a[x][y]==5||a[x][y]==6

)

else

if(r==2)//

入口在右

else

if(r==3)//

入口在上

else

//入口在下

}//彎水管的情況

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

)

else

if(r==2

)

else

if(r==3

)

else

}b[x][y]=0;//

嘗試過不能用的點要取消標記並且出棧

top--;

return;}

intmain()

}dfs(

1,1,1

);

if(flag==0

) printf(

"impossible");

printf("\n

");return0;

}

DFS 水管工遊戲

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

水管工遊戲 dfs(遞迴)

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

水管工遊戲 dfs的應用

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