hrbust 訓練賽 1143
阿新 • • 發佈:2017-10-28
turn pro font get span void printf scrip tar
鏈接:
http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=18435
題目:
Description
Leyni是一個地址調查員,有一天在他調查的地方突然出現個泉眼。由於當地的地勢不均勻,有高有低,他覺得如果這個泉眼不斷的向外溶出水來,這意味著這裏在不久的將來將會一個小湖。水往低處流,凡是比泉眼地勢低或者等於的地方都會被水淹沒,地勢高的地方水不會越過。而且又因為泉水比較弱,當所有地勢低的地方被淹沒後,水位將不會上漲,一直定在跟泉眼一樣的水位上。
由於Leyni已經調查過當地很久了,所以他手中有這裏地勢的詳細數據。所有的地圖都是一個矩形,並按照坐標系分成了一個個小方格,Leyni知道每個方格的具體高度。我們假定當水留到地圖邊界時,不會留出地圖外,現在他想通過這些數據分析出,將來這裏將會出現一個多大面積的湖。
Input
有若幹組數據,每組數據的第一行有四個整數n,m,p1,p2(0<n,m,p1,p2<=1000),n和m表示當前地圖的長和寬,p1和p2表示當前地圖的泉眼位置,即第p1行第p2列,隨後的n行中,每行有m個數據。表示這每一個對應坐標的高度。
Output
輸出對應地圖中會有多少個格子被水充滿。
Sample Input
3 5 2 3
3 4 1 5 1
2 3 3 4 7
4 1 4 1 1
Sample Output
6
解題分析:
可以向四個方向走,但要求高度要小於當前高度,dfs一直遞歸搜索,直到找不到就回溯到起始點並記錄個數,再搜索。
代碼:
#include<bits/stdc++.h> usingnamespace std; int n , m , p1 , p2; int vis[1005][1005]; int a[1005][1005]; int ans; int xf[4] = {1,0,-1,0}; int yf[4] = {0,1,0,-1}; void dfs(int x, int y) { if(vis[x][y]) { return; //直接退出dfs函數 } if(!vis[x][y]) { ans++; vis[x][y] = 1; } for(int i = 0 ; i < 4; i++) { int xtmp = x + xf[i]; int ytmp = y + yf[i]; if(xtmp >= 1 && xtmp <= n && ytmp >= 1 && ytmp <= m && a[xtmp][ytmp] <= a[p1][p2]) { dfs(xtmp,ytmp); } } return ; } int main() { while(~scanf("%d%d%d%d",&n,&m,&p1,&p2)) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { scanf("%d",&a[i][j]); } } memset(vis, 0 ,sizeof(vis)); ans = 0; dfs(p1,p2); printf("%d\n",ans); } return 0; }
hrbust 訓練賽 1143