1. 程式人生 > 實用技巧 >洛谷P2372 —yyy2015c01挑戰算周長題解

洛谷P2372 —yyy2015c01挑戰算周長題解

https://www.luogu.com.cn/problem/P2372

題目大意:

給你一個矩陣和一個點的座標,讓你求出這個點所在的連通塊的周長。

那麼周長怎麼求呢?

你不要告訴我連這你都不會

將這個連通塊的每一個點上靠邊的長度加起來即為周長。

主要思路:dfs搜尋

將每一個點的周長都算出來,在搜尋連通塊時將搜到的點的周長都加起來,輸出即可。

坑點:

  1. 在邊上的點也有周長

  2. 搜周長時搜上下左右4個方向

  3. 連通塊8面連通

  4. 走過的點不能重複走

最後貼上程式碼:

 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 }

蟹蟹觀看!

完結撒花(。・∀・)ノ❀❀❀