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

1359:围成面积

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


【问题描述】

    桐桐拿到了一幅图,它全是由“O”和“*”组成,她想计算由“*”号所围成的图形的面积。面积的计算方法是统计“*”号所围成的闭合曲线中“O”的数目。

【输入格式】

    由O,*组成的图(最多10行,每行不超过200个字符)。

【输出格式】

    面积数。

【输入样例】

    **00*

    0****

    0*00*

    0****

【输出样例】

    2




C++参考代码一:

#include <cstring>
#include <iostream>
#include <cstdio>
using namespace std;
int map[256][256];
string st;
int m=0,n,ans=0;
int len;
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
void search(int x,int y)
{
	//溢出处理 
	if(x<0 || y<0 || x>m+1 || y>len+1 || map[x][y] != 0 )
	{
		//撞了南墙就回头 
		return;
	}
	
	map[x][y]=1;
	//cout<<"x="<<x<<" y="<<y<<" "<<map[x][y]<<endl;
	
	for(int i=0;i<4;++i)
	{
		search(x+dx[i],y+dy[i]);
	}
}
int main( void )
{
	memset(map,0,sizeof(map));
	
	while( getline(cin, st) )
	{
		++m;
		len=st.length();
		//cout<<"len="<<len<<endl;
		for(int i=1;i<=len;++i)
		{
			if( st[i-1]=='0' ) 
			{
				map[m][i]=0;
			}
			else
			{
				map[m][i]=1;
			}
			//cout<<"m="<<m<<" i="<<i<<" "<<map[m][i]<<endl;
		}
	}
	
	cout<<"处理前:"<<endl; 
	for(int i=0;i<=m+1;++i)
	{
		for(int j=0;j<=len+1;++j)
		{
			cout<<map[i][j]<<" ";
		}
		cout<<endl;
	}
	
	
	search(0,0);
	cout<<"---------------------------"<<endl;
	cout<<"处理后:"<<endl; 
	for(int i=0;i<=m+1;++i)
	{
		for(int j=0;j<=len+1;++j)
		{
			cout<<map[i][j]<<" ";
		}
		cout<<endl;
	}
	
	for(int i=1;i<=m;++i)
	for(int j=1;j<=len;++j)
	{
		if(map[i][j]==0)  ++ans;
		cout<<"ans="<<ans<<endl;
	}
	
	cout<<ans<<endl;
	
	return 0;
}
/*
**00*
0****
0*00*
0****
ctrl+z

ctrl+x
ctrl+z

用这个代码表示只要输入不结束,我就一直按行读取。
但是这个需要用户在输入结束的时候另起一行输入“ctrl+z",
getline可以识别这个符号作为输入的结束符。

C++多行输入且行数未知
https://blog.csdn.net/Lc_summer/article/details/120394540

【C++】多行未知长度的字符串输入
https://blog.csdn.net/pw1623/article/details/100044699

*/


C++参考代码二:

/*
1359:围成面积01
http://ybt.ssoier.cn:8088/problem_show.php?pid=1359

https://www.cnblogs.com/tflsnoi/p/10170855.html
*/
#include<iostream>
#include<queue>
#include <bits/stdc++.h>
using namespace std;
const int n=10;
int a[n+5][n+5];
int nex[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int ans=0;
struct m{
    int x;
    int y;
}f, t;
void bfs(int xx, int yy)
{
    queue<m> q;
    t.x=xx; 
	t.y=yy;
    
	//0变1即变为* 
	a[t.x][t.y]=1;
    
    //入队 
	q.push(t);
    
	while( !q.empty() )
    {
        f=q.front();
        for(int k=0; k<4; k++)
        {
            int nx=f.x+nex[k][0];
            int ny=f.y+nex[k][1];
            
			if(nx>=0 && nx<n && ny>=0 && ny<n && a[nx][ny]==0)
            {
                a[nx][ny]=1;
                t.x=nx;  
				t.y=ny;
                
                //入队 
				q.push(t);
            }
        }
        
		//出队 
		q.pop();
    }    
}

int main(void)
{
    
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cin>>a[i][j];
    
    for(int j=0;j<=9;j++)//以上边缘开始bfs置1 
        if(a[0][j]==0)	bfs(0,j);
    
	for(int j=0;j<=9;j++)//以下边缘开始bfs置1 
        if(a[9][j]==0)	bfs(9,j);
    
	for(int i=0;i<=9;i++)//以左边缘开始bfs置1 
        if(a[i][0]==0)	bfs(i,0);
    
	for(int i=0;i<=9;i++)//以右边缘开始bfs置1 
        if(a[i][9]==0)	bfs(9,i);

//以下注释为测试代码 
//cout<<endl;
//    for(int i=0; i<n; i++){
//        for(int j=0; j<n; j++)cout<<a[i][j]<<" ";
//        cout<<endl;
//    }

    for(int i=0; i<n; i++)//最后统计没有置1的所有的点,即面积点数 
        for(int j=0; j<n; j++)
            if(a[i][j]==0)
			{
				++ans;
			}    
    cout<<ans;
    return 0;
}


C++参考代码三:

/*
1359:围成面积
http://ybt.ssoier.cn:8088/problem_show.php?pid=1359

https://www.cnblogs.com/tflsnoi/p/10170855.html
*/
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int cnt;
int mp[101];
queue<int> q;
vector<int> v;

void search(int s)
{
  q.push(s);
  mp[s] = 1;
  while (!q.empty())
  {
    int k = q.front();
    q.pop();
    if (k % 10 != 0 && mp[k + 1] == 0)
      q.push(k + 1), mp[k + 1] = 1;
    if (k + 10 <= 100 && mp[k + 10] == 0)
      q.push(k + 10), mp[k + 10] = 1;
    if (k % 10 != 1 && mp[k - 1] == 0)
      q.push(k - 1), mp[k - 1] = 1;
    if (k - 10 >= 1 && mp[k - 10] == 0)
      q.push(k - 10), mp[k - 10] = 1;  
  }
}

int main()
{
  int c, h = -1, s, m = 0;
  for (int i = 1; i <= 10; i++)
    for (int j = 1; j <= 10; j++)
    {
      cin >> c;
      mp[++cnt] = c;
      if (c == 0 && ((i == 10 || i == 1) || (j == 10 || j == 1)))
        v.push_back(cnt);
    }

	for (int i = 0; i < v.size(); i++)
		search(v[i]);
  
	for (int i = 1; i <= 100; i++)
		if (mp[i] == 0)
      		m++;
  	cout << m;
  	
	return 0;
}



 


 


 




2.5基本算法之搜索

OpenJudge - OpenJudge - 题目

4.7算法之搜索

OpenJudge - OpenJudge - 题目

1317:【例5.2】组合的输出

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

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

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

1212:LETTERS

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

1213:八皇后问题

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

1214:八皇后

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

 




NOIP2015 day1 T3_斗地主P2668 斗地主

[NOIP2015 提高组] 斗地主 - 洛谷

NOIP2017年普及组第3题 棋盘

[NOIP2017 普及组] 棋盘 - 洛谷

NOIP2015年提高组 第2题 P2661 信息传递(Tarjen bfs/dfs(图论))

[NOIP2015 提高组] 信息传递 - 洛谷

NOIP2016年提高组 第2题 天天爱跑步

(Lca/ dfs(图论)树结构 最近公共祖先)

[NOIP2016 提高组] 天天爱跑步 - 洛谷

NOIP2000普及组 第4题 P1019 单词接龙(深搜)

[NOIP2000 提高组] 单词接龙 - 洛谷

NOIP2000年提高组 第3题  单词接龙(DFS,字符串,模拟)

[NOIP2000 提高组] 单词接龙 - 洛谷

NOIP2014普及组 第4题 P2258 子矩阵(搜索或 dp)

[NOIP2014 普及组] 子矩阵 - 洛谷

NOIP2018年提高组 第3题  P5021 赛道修建

(搜索 深度优先搜索)

[NOIP2018 提高组] 赛道修建 - 洛谷

 




【算法1-7】搜索

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

4.7算法之搜索

OpenJudge - OpenJudge - 题目

 

 

  • 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、付费专栏及课程。

余额充值