洛谷P2372 —yyy2015c01挑戰算周長題解
阿新 • • 發佈:2020-08-18
https://www.luogu.com.cn/problem/P2372
題目大意:
給你一個矩陣和一個點的座標,讓你求出這個點所在的連通塊的周長。
那麼周長怎麼求呢?
你不要告訴我連這你都不會
將這個連通塊的每一個點上靠邊的長度加起來即為周長。
主要思路:dfs搜尋
將每一個點的周長都算出來,在搜尋連通塊時將搜到的點的周長都加起來,輸出即可。
坑點:
-
在邊上的點也有周長
-
搜周長時搜上下左右4個方向
-
連通塊8面連通
-
走過的點不能重複走
最後貼上程式碼:
1 #include<iostream> 2 using namespace std; 3 int n,m;4 bool b[23][23]={0},flag[23][23]={0};//原陣列和標記陣列(標記是否走過) 5 int a[23][23]={0};//邊長 6 const int x1[10]={-1,-1,-1,0,1,1,1,0},y1[10]={-1,0,1,1,1,0,-1,-1};//偏移量 7 int dfs(int x,int y) 8 { 9 flag[x][y]=1;//標記已走過 10 int ans=a[x][y]; 11 for(int i=0;i<8;i++) 12 if(b[x+x1[i]][y+y1[i]]&&!flag[x+x1[i]][y+y1[i]])ans+=dfs(x+x1[i],y+y1[i]);//邊界都是0,不用擔心邊界問題 13 return ans; 14 } 15 void ch() 16 { 17 for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) 18 if(b[i][j]) 19 { 20 if(!b[i-1][j])a[i][j]++; 21 if(!b[i][j-1])a[i][j]++; 22 if(!b[i][j+1])a[i][j]++; 23 if(!b[i+1][j])a[i][j]++;24 }//每個點的靠邊長度 25 } 26 int main() 27 { 28 char c; 29 int x,y; 30 cin>>n>>m>>x>>y; 31 for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) 32 { 33 cin>>c; 34 if(c=='X')b[i][j]=1;//初始化原陣列 35 } 36 ch(); 37 // for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) 38 // { 39 // cout<<a[i][j]<<" "; 40 // if(j==m)cout<<endl; 41 // }用於測試靠邊長度 42 cout<<dfs(x,y); 43 return 0; 44 }