1359:围成面积


题目链接: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 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM