题目描述
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(1<=m,n<=100)?
输入输出格式
输入格式: 输入:整数m,n(m行,n列)
矩阵
输出格式: 输出:细胞的个数
输入输出样例
输入样例#1:4 10
0234500067
1034560500
2045600671
0000000089
输出样例#1: 4
dfs每个非0且未访问的数字。
#include<iostream> #include<string> #define MAXN 200 using namespace std; int a[MAXN][MAXN]; int m,n; bool vis[MAXN][MAXN]; int ans; inline bool pd(int x,int y) { if(x<=m&&x>0&&y<=n&&y>0) return true; return false; } void dfs(int x,int y) { if(vis[x][y]||a[x][y]==0) return; a[x][y]=-1; vis[x][y]=1; if(pd(x+1,y)) dfs(x+1,y); if(pd(x-1,y)) dfs(x-1,y); if(pd(x,y+1)) dfs(x,y+1); if(pd(x,y-1)) dfs(x,y-1); return; } int calc() { int i,j; int cnt=0; for(i=1; i<=m; i++) { for(j=1; j<=n; j++) { if(a[i][j]==-1) { a[i][j]=0; cnt++; } } } return cnt; } void show(){ for(int i=1; i<=m; i++) { for(int j=1; j<=n; j++) { cout<<a[i][j]<<" "; } cout<<endl; } cout<<endl; } int main() { int i,j; cin>>m>>n; string s; for(i=1; i<=m; i++) { cin>>s; for(j=0; j<n ; j++) { a[i][j+1]=s[j]-'0'; } } for(i=1; i<=m; i++) { for(j=1; j<=n; j++) { if(!vis[i][j]&&a[i][j]!=0) { dfs(i,j); // show(); int re=calc(); if(re>0) ans++; } } } cout<<ans; return 0; }
和swim很像。。恩
宽搜版:
#include<iostream>
#include<queue>
#include<string>
#define MAXN 200
using namespace std;
int n,m;
int a[MAXN][MAXN];
int cnt;
bool vis[MAXN][MAXN];
int mx[4]= {1,0,-1,0};
int my[4]= {0,1,0,-1};
struct point {
int x,y;
} node,r;
void bfs(int x,int y) {
a[x][y]=0;
vis[x][y]=1;
queue<point> Q;
node.x = x;
node.y = y;
Q.push(node);
while(!Q.empty() ) {
r=Q.front() ;
Q.pop();
for(int i=0; i<=3; i++) {
int nx=r.x + mx[i],ny=r.y + my[i];
if(nx>0&&nx<=m&&ny>0&&ny<=n&&a[nx][ny]!=0&&!vis[nx][ny]) {
a[nx][ny]=0;
vis[nx][ny]=1;
node.x = nx;
node.y = ny;
Q.push(node);
}
}
}
}
void show(){
for(int i=1; i<=m; i++) {
for(int j=1; j<=n; j++) {
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
int main() {
string s;
cin>>m>>n;
int i,j;
for(i=1; i<=m; i++) {
cin>>s;
for(j=0; j<n; j++) {
a[i][j+1]=s[j]-'0';
}
}
for(i=1; i<=m; i++) {
for(j=1; j<=n; j++) {
if(a[i][j]!=0) {
bfs(i,j);
cnt++;
}
}
}
cout<<cnt;
}