這個挖礦遊戲會給出一個n*m個格子的地圖,每個格子都有黃金。在遊戲開始時小明會隨機出現在地圖的某一個格子當中。小明可以將他所在的格子的黃金收歸囊中,並且還可以向下或者向右移動,然後繼續收集黃金。地圖上某些格子是障礙物,小明不能移動到有障礙物的格子上。不過,在遊戲開始時,小明可以隨意地在地圖上放置傳送門。傳送門可以傳送到地圖上某一個確定的格子,傳送門放置的位置和該傳送門傳送的位置在遊戲開始之前必須放置和設置好傳送地點。小明有無數個傳送門可以使用,但是每次使用傳送門所需要的遊戲幣也是很多的。小明想要至少要使用多少個傳送門才能讓他在遊戲時無論出現在哪個格子,他都能拿到地圖上的所有金子。
輸入描述:
有多組測試數據。 對於每一組數據: 第一行輸入兩個整數n和m(0<n,m<=1000),分別表示地圖的行數和列數。 接下來輸入n行,每行m個字符。每個字符只存在“.”和“#”,“.”表示此格子是黃金,“#”表示此格子是障礙物。
輸出描述:
輸出一行。此行包括一個整數,表示小明所需傳送門數量的最小值。
輸入
3 3 ... .#. ...
輸出
1
#include<iostream> using namespace std; const int N =1005; typedef long long ll ; #define f(i,l,r) for(int i=l;i<=r;++i) #define g(i,l,r) for(int i=l;i>=r;--i) char a[N][N]; int main() { int n,m; int cnt = 0,ans=0; cin>>n>>m; f(i,1,n)cin>>a[i]+1; f(i,1,n)f(j,1,m) { if(a[i][j] =='.')cnt++; if(a[i][j] !='#'&&a[i+1][j]!='#'&&a[i][j+1]!='#')ans++; } if(cnt==1) cout<<0<<endl; else cout<<ans<<endl; }