第八章 搜索策略(C++)_第4课 面积计算——宽度搜索(area) 《聪明人的游戏 信息学探秘.提高篇》

【问题描述】

    桐桐拿到了一幅图,全是由“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】搜索

【算法1-7】搜索 - 题单 - 洛谷

2.5基本算法之搜索

OpenJudge - OpenJudge - 题目

4.7算法之搜索

OpenJudge - OpenJudge - 题目

1317:【例5.2】组合的输出

信息学奥赛一本通(C++版)在线评测系统

1318:【例5.3】自然数的拆分

信息学奥赛一本通(C++版)在线评测系统

1212:LETTERS

信息学奥赛一本通(C++版)在线评测系统

1213:八皇后问题

信息学奥赛一本通(C++版)在线评测系统

1214:八皇后

信息学奥赛一本通(C++版)在线评测系统

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dllglvzhenfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值