1329:【例8.2】细胞
【题目描述】
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:
阵列
4 10 0234500067 1034560500 2045600671 0000000089
有4个细胞。
【输入】
第一行为矩阵的行n和列m;
下面为一个n*m的矩阵
【输出】
细胞个数。
【输入样例】
4 10 0234500067 1034560500 2045600671 0000000089
【输出样例】
4
#include<bits/stdc++.h>//万能头还挺好用(考试千万别用啊) using namespace std; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//各种路径的情况 int bz[100][100],num=0,n,m; void doit(int p,int q) { int x,y,t,w,i; int h[1000][2]; num++;//计次专用 bz[p][q]=0; t=0;w=1;h[1][1]=p;h[1][2]=q;//一波特判 do { t++; for(int i=0;i<=3;i++)//大力模拟各种情况,广搜 { x=h[t][1]+dx[i]; y=h[t][2]+dy[i]; if((x>=0)&&(x<m)&&(y>=0)&&(y<n)&&(bz[x][y]))//if判断十分重要 { w++; h[w][1]=x; h[w][2]=y; bz[x][y]=0; } } } while(t<w); } int main() { int i,j; char s[100],ch; scanf("%d%d ",&m,&n); for(int i=0;i<=m-1;i++) { for(int j=0;j<=n-1;j++) { bz[i][j]=1; } } for(int i=0;i<=m-1;i++) { scanf("%s",s); for(int j=0;j<=n-1;j++) { if(s[j]=='0') { bz[i][j]=0; } } } for(int i=0;i<=m-1;i++) { for(int j=0;j<=n-1;j++) { if(bz[i][j]) { doit(i,j); } } } printf("%d",num); }
这个题相对来说还挺好理解的
主要的还是广搜的思想
学会的可以拿下面的题目来试试(PS:下面这个题与细胞极为相似,但需要用字符串哦qwq)