题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1359
【思路分析】这个题属于逆向思维,直接统计围成面积很难,换种思路,将面积以外的所有0点置1再统计0数即为围成面积,这样就转换成4连通块的问题了!当然这儿有个小思考就是外围面积置1时一定要从4条边缘开始找0点BFS,所以需要将BFS写成一个函数。代码如下:
1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 const int n=10; 5 int a[n+5][n+5]; 6 int nex[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; 7 int ans=0; 8 struct m{ 9 int x; 10 int y; 11 }f, t; 12 void bfs(int xx, int yy) 13 { 14 queue<m> q; 15 t.x=xx; t.y=yy; 16 a[t.x][t.y]=1; 17 q.push(t); 18 while(!q.empty()) 19 { 20 f=q.front(); 21 for(int k=0; k<4; k++) 22 { 23 int nx=f.x+nex[k][0]; 24 int ny=f.y+nex[k][1]; 25 if(nx>=0 && nx<n && ny>=0 && ny<n && a[nx][ny]==0) 26 { 27 a[nx][ny]=1; 28 t.x=nx; t.y=ny; 29 q.push(t); 30 } 31 } 32 q.pop(); 33 } 34 } 35 36 int main() 37 { 38 39 for(int i=0; i<n; i++) 40 for(int j=0; j<n; j++) 41 cin>>a[i][j]; 42 43 for(int j=0;j<=9;j++)//以上边缘开始bfs置1 44 if(a[0][j]==0)bfs(0,j); 45 for(int j=0;j<=9;j++)//以下边缘开始bfs置1 46 if(a[9][j]==0)bfs(9,j); 47 for(int i=0;i<=9;i++)//以左边缘开始bfs置1 48 if(a[0][i]==0)bfs(0,i); 49 for(int i=0;i<=9;i++)//以右边缘开始bfs置1 50 if(a[9][i]==0)bfs(9,i); 51 //以下注释为测试代码 52 //cout<<endl; 53 // for(int i=0; i<n; i++){ 54 // for(int j=0; j<n; j++)cout<<a[i][j]<<" "; 55 // cout<<endl; 56 // } 57 for(int i=0; i<n; i++)//最后统计没有置1的所有的点,即面积点数 58 for(int j=0; j<n; j++) 59 if(a[i][j]==0)++ans; 60 cout<<ans; 61 return 0; 62 }