华师一附中OI组
标题:
P1451 求细胞数量
[打印本页]
作者:
admin
时间:
2018-5-12 23:02
标题:
P1451 求细胞数量
https://www.luogu.org/problemnew/show/P1451
题目描述
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(1<=m,n<=100)?
输入输出格式
输入格式:
输入:整数m,n(m行,n列)
矩阵
输出格式:
输出:细胞的个数
输入输出样例
输入样例#1:
4 10
0234500067
1034560500
2045600671
0000000089
输出样例#1:
4
作者:
admin
时间:
2019-10-27 17:49
典型的种子填充算法,直观的用两个二维数组,一个a表示当前的棋盘,一个v表示是否被访问过,然后每行每列逐个扫描填充。
#include<iostream>
using namespace std;
const int mm=110;
int m,n,x;
char ch;
int a[mm][mm]; ///原始棋盘
int v[mm][mm]; ///是否被访问
int dr[]= {0,+1,+0,-1,+0};
int dc[]= {0,+0,+1,+0,-1}; ///下右上左
void check() ///检查a数组和v数组
{
for (int r=1; r<=m; r++,cout<<endl)
for (int c=1; c<=n; c++) cout<<a[r][c];
for (int r=1; r<=m; r++,cout<<endl)
for (int c=1; c<=n; c++) cout<<v[r][c];
}
void bfs(int r ,int c,int x) ///从rc处开始给区域染色为x
{
///cout<<r<<' '<<c<<' '<<x<<endl;
int qr[mm*mm],qc[mm*mm]; ///队列,注意空间大小
int h=1,t=2;
qr[h]=r,qc[h]=c,v[r][c]=x;///队头染色
while (h<t)
{
for (int i=1; i<=4; i++)
{
int tr=qr[h]+dr[i],tc=qc[h]+dc[i];
if (a[tr][tc]!=0 && v[tr][tc]==0)
{
v[tr][tc]=x;
qr[t]=tr,qc[t]=tc,t++;
}
}
h++;
}
}
int main()
{
cin>>m>>n;
for (int r=1; r<=m; r++)
for (int c=1; c<=n; c++)
{
cin>>ch;
a[r][c]=ch-'0';
}
for (int r=1; r<=m; r++)
for (int c=1; c<=n; c++)
if (a[r][c]!=0 && v[r][c]==0) bfs(r,c,++x);
///check();
cout<<x;
return 0;
}
/*
4 10
0234500067
1034560500
2045600671
0000000089
*/
复制代码
作者:
admin
时间:
2019-10-27 17:53
此题是我爱说的全搜索的题目,棋盘上的每一个点都要被搜到,所以可以用BFS也可以用DFS,为一个区别就是主程序的二维循环中bfs改成dfs,而且,要是dfs的话是不是有点像tarjar算法?那么来一个DFS版本的吧
#include<iostream>
using namespace std;
const int mm=110;
int m,n,x;
char ch;
int a[mm][mm]; ///原始棋盘
int v[mm][mm]; ///是否被访问
int dr[]= {0,+1,+0,-1,+0};
int dc[]= {0,+0,+1,+0,-1}; ///下右上左
void check() ///检查a数组和v数组
{
for (int r=1; r<=m; r++,cout<<endl)
for (int c=1; c<=n; c++) cout<<a[r][c];
for (int r=1; r<=m; r++,cout<<endl)
for (int c=1; c<=n; c++) cout<<v[r][c];
}
void dfs(int r ,int c,int x) ///从rc处开始给区域染色为x
{
a[r][c]=x,v[r][c]=1;
///cout<<r<<' '<<c<<endl;check();int y;cin>>y;
for (int i=1; i<=4; i++)
{
int tr=r+dr[i],tc=c+dc[i];
if (a[tr][tc]!=0 && v[tr][tc]==0)dfs(tr,tc,x);
}
}
int main()
{
cin>>m>>n;
for (int r=1; r<=m; r++)
for (int c=1; c<=n; c++)
{
cin>>ch;
a[r][c]=ch-'0';
}
for (int r=1; r<=m; r++)
for (int c=1; c<=n; c++)
if (a[r][c]!=0 && v[r][c]==0) dfs(r,c,++x);
///check();
cout<<x;
return 0;
}
/*
4 10
0234500067
1034560500
2045600671
0000000089
*/
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2