實現DFS之「農田灌溉」

2021-07-02 07:43:05 字數 1968 閱讀 5601

這也是一道利用了dfs的題目,先說下我的思路:用乙個二維陣列記錄每個字母所代表的含義(管道方向),用另乙個二維陣列記錄4個方向的變換座標;隨後利用經典的dfs遞迴遍歷即可~(還要注意在方向的處理上前後要保持一致,否則很容易計算出錯 :| )

農田灌溉(farm irrigation)   

題目描述: 

benny有一大片農田需要灌溉。農田是乙個長方形,被分割成許多小的正方形。每個正方形中都安裝了水管。不同的正方形農田中可能安裝了不同的水管。一共有11種水管,分別用字母a~k標明,如圖1所示。 

benny農田的地圖是由描述每個正方形農田中水管型別的字母組成的矩陣。例如,如果農田的地圖為: adc fjk ihe 

則農田中水管分布如圖2所示。 

某些正方形農田的中心有水源,因此水可以沿著水管從乙個正方形農田流向另乙個正方形農田。如果水可以流經某個正方形農田,則整個正方形農田可以全部灌溉到。 benny想知道至少需要多少個水源,以保證整個農田都能被灌溉到? 例如,圖2所示的農田至少需要3個水源,圖中的圓點表示每個水源。  

輸入描述:  

輸入檔案中包含多個測試資料。每個測試資料的第1行為兩個整數m和n,表示農田中有m行,每行有n個正方形。接下來有m行,每行有n個字元。字元的取值為'a'~'k',表示對應正方形農田中水管的型別。當m或n取負值時,表示輸入檔案結束。如果m和n的值為正數,則其取值範圍是1≤m, n≤50。  

輸出描述:  

對輸入檔案中的每個測試資料所描述的農田,輸出佔一行,為求得的所需水源數目的最小值。  

樣例輸入:  

2 2dk

hf 3 3

adc

fjk

ihe

-1 -1

樣例輸出: 

2 3閒話少敘,直接上**+注釋~

code:

[cpp]view plain

copy

print

?#include

using

namespace

std;  

#define maxn 50

char

map[maxn][maxn];   

//地圖

intm, n;               

//m:農田行數,n:每行的正方形個數

intdir[4][2] = , , ,  };   

//管道座標變換的四個方向:對應的順序上下左右。

intdiro[11][4] = , , ,  

, , ,  

, , ,  

,   

};      //每種農田塊對應的4個管道方向(-1為左或上、1為右或下、0為沒有)。

void

dfs(

intx, 

inty)  

//否則為向下走(1)或向右走(3),比如向下走則判斷原座標的「下」管道和下乙個方向座標的「上」管道。對應方向所代表的值-1

else

if(map[xx][yy]!=

'y'&& diro[temp-

'a'][i]*diro[map[xx][yy]-

'a'][i-1]==-1) dfs(xx, yy);  

}  }  

intmain()  

printf("%d\n"

, count);  

}  return

0;  

}  

執行結果:

如有bug,歡迎拍磚~ :)

營銷之農田法則

其實很多事情都是想通的,現下最流行的網路營銷和傳統的營銷模式區別在那?就是營銷的手段不同,採用的媒介不同,但是它們的最終目的都是相同的,為了品牌或是銷售的提公升。今天我們不討論兩種營銷方式的優劣,從本質來看問題。因為我們的seo診斷業務主要是面對中小企業的,所以空城經常會和各類企業的老闆打交道,他們...

DFS的遞迴實現

對乙個例子的理解,以下是關係圖的關係矩陣,求從1開始能到哪個數 include include e include include using namespace std intconst n 5 int maze n n int visit n 1 迴圈的思路 用遞迴,一旦有更深的點就產生新的迴圈...

DFS實現floodfill演算法

多組案例,每組案例輸入乙個m行n列的字元矩陣,統計字元 組成多少個連通塊。如果兩個字元 所在的格仔相鄰 橫 豎或對角線 則說明它們屬於同一連通塊。sample input 1 1 3 5 1 8 5 5 0 0sample output 012 21.找到油田,然後通過迴圈遍歷他周圍的八個位置,不斷...