【问题描述】
桐桐拿到了一幅图,全是由“O”和“*”组成,她想计算由“*”号所围成的图形的面积。面积的计算方法是统计“*”号所围成的闭合曲线中“O”的数目。
【输入格式】
由O,*组成的图(最多1000行,每行不超过200个字符)。
【输出格式】
面积数。
【输入样例】
**00*
0****
0*00*
0****
【输出样例】
2
/*
第4课 面积计算——宽度搜索(area)广度优先搜索
*/
#include <bits/stdc++.h>
using namespace std;
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
int map02[1000+10][1000+10];
int que[1010*1010][2];//1000*200 1010*205=( (100+10)*(200+6) )
string st;
int m,n;
int len;
int ans=0;
void bfs(int x,int y)
{
int tempx,tempy;
//队列头指针和尾指针。
//头结点为空,尾结点不为空
int head=0;
int tail=1;
//入队
que[tail][0]=x;
que[tail][1]=y;
//标记当前点已经走过
map02[x][y]=1;
//head==tail即队列为空
while( head != tail )
{
//定位到队列的第1个元素
++head;
//当前的点
x=que[head][0];
y=que[head][1];
for(int i=0;i<4;++i)
{
tempx=x+dx[i];
tempy=y+dy[i];
//判断溢出及是否为0
//map02[tempx][tempy]如果不为0,则表示已经遍历过
if( tempx<0 || tempy<0 || tempx>m+1 || tempy>n+1 || map02[tempx][tempy] != 0 )
{
//跳出本次循环
continue;
}
//标记已经访问过
map02[tempx][tempy]=1;
//入队
tail++;
que[tail][0]=tempx;
que[tail][1]=tempy;
}
}
//head==tail 队列为空
//队列为满 (tail+1)%n==head
}
int main( void )
{
m=0;
memset( map02,0,sizeof(map02));
while( getline(cin,st) )
{
//输入的行数
++m;
n=st.length();
for( int i=1;i<=n;++i)
{
//int map02[1010][1010];
if(st[i-1] =='0') map02[m][i]=0;
else map02[m][i]=1;
}
}
//输出转换的整型数组
for(int i=0;i<=m+1;++i)
{
for(int j=0;j<=n+1;++j)
{
cout<<map02[i][j]<<" ";
}
cout<<endl;
}
//广度优先搜索
bfs(0,0);
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
{
if( 0 == map02[i][j] )
{
++ans;
}
}
cout<<ans<<endl;
return 0;
}
/*
**00*
0****
0*00*
0****
C++基础 200分
普及组:200个小左右
提高组:300-500小时左右
memset函数 fill函数 使用技巧 解析及易错点
https://blog.csdn.net/dllglvzhenfeng/article/details/127361040
以代码编织梦想,用机遇丰富人生
http://www.noi.cn/newsview.html?id=1329&hash=0FF837&type=1
C++中的fill函数与memset函数的区别
https://ilovemss.blog.csdn.net/article/details/95207691
fill函数与memset函数的区别
https://blog.csdn.net/weixin_43910851/article/details/105438994
*/
【算法1-7】搜索
2.5基本算法之搜索
4.7算法之搜索
1317:【例5.2】组合的输出
1318:【例5.3】自然数的拆分
1212:LETTERS
1213:八皇后问题
1214:八皇后