給你一個矩陣和一個點的座標,讓你求出這個點所在的連通塊的周長。ios
那麼周長怎麼求呢?數組
你不要告訴我連這你都不會測試
就是將這個連通塊的每個點上靠邊的長度加起來即爲周長。spa
將每個點的周長都算出來,在搜索連通塊時將搜到的點的周長都加起來,輸出便可。code
在邊上的點也有周長ci
搜周長時搜上下左右\(4\)個方向get
連通塊\(8\)面連通io
走過的點不能重複走class
#include<iostream> using namespace std; int n,m; bool b[23][23]={0},flag[23][23]={0};//原數組和標記數組(標記是否走過) int a[23][23]={0};//邊長 const int x1[10]={-1,-1,-1,0,1,1,1,0},y1[10]={-1,0,1,1,1,0,-1,-1};//偏移量 int dfs(int x,int y) { flag[x][y]=1;//標記已走過 int ans=a[x][y]; for(int i=0;i<8;i++) if(b[x+x1[i]][y+y1[i]]&&!flag[x+x1[i]][y+y1[i]])ans+=dfs(x+x1[i],y+y1[i]);//邊界都是0,不用擔憂邊界問題 return ans; } void ch() { for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) if(b[i][j]) { if(!b[i-1][j])a[i][j]++; if(!b[i][j-1])a[i][j]++; if(!b[i][j+1])a[i][j]++; if(!b[i+1][j])a[i][j]++; }//每一個點的靠邊長度 } int main() { char c; int x,y; cin>>n>>m>>x>>y; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) { cin>>c; if(c=='X')b[i][j]=1;//初始化原數組 } ch(); // for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) // { // cout<<a[i][j]<<" "; // if(j==m)cout<<endl; // }用於測試靠邊長度 cout<<dfs(x,y); return 0; }