1359:围成面积
【问题描述】
桐桐拿到了一幅图,它全是由“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基本算法之搜索
4.7算法之搜索
1317:【例5.2】组合的输出
1318:【例5.3】自然数的拆分
1212:LETTERS
1213:八皇后问题
1214:八皇后
NOIP2015 day1 T3_斗地主P2668 斗地主
NOIP2017年普及组第3题 棋盘
NOIP2015年提高组 第2题 P2661 信息传递(Tarjen bfs/dfs(图论))
NOIP2016年提高组 第2题 天天爱跑步
(Lca/ dfs(图论)树结构 最近公共祖先)
NOIP2000普及组 第4题 P1019 单词接龙(深搜)
NOIP2000年提高组 第3题 单词接龙(DFS,字符串,模拟)
NOIP2014普及组 第4题 P2258 子矩阵(搜索或 dp)
NOIP2018年提高组 第3题 P5021 赛道修建
(搜索 深度优先搜索)
【算法1-7】搜索
4.7算法之搜索