Problem Description
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
Input
输入第一行为T,表示有T组测试数据,对于每组测试数据第一行为m和n(1<m,n<100),表示矩阵的行和列。下面m行是矩阵。
Output
对于每组测试数据,输出矩阵中的细胞个数。
Sample Input
1 4 10 0234500067 1034560500 2045600671 0000000089
Sample Output
4
//标程:
#include<stdio.h> #include<queue> #include<string.h> using namespace std;
char p[110][110]; int n,m,vis[110][110]; int dir[4][2]={0,1,1,0,0,-1,-1,0};
struct ss { int x,y; }; queue<ss> q;
void bfs() { int x,y,i,x1,y1; while(!q.empty()) { ss ans=q.front(); q.pop(); x=ans.x, y=ans.y; for(i=0;i<4;i++) { x1=x+dir[i][0], y1=y+dir[i][1]; if(x1>=0 && x1<n && y1>=0 && y1<m && !vis[x1][y1] && p[x1][y1]>'0') { ans.x=x1, ans.y=y1; q.push(ans); vis[x1][y1]=1; } } } } int main() { //freopen("a.txt","r",stdin); int t,i,j; scanf("%d",&t); while(t--) { while(!q.empty()) q.pop(); memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%s",p[i]); for(i=0;i<n;i++) for(j=0;j<m;j++) if(p[i][j]=='0') vis[i][j]=1; ss temp; int cnt=0; for(i=0;i<n;i++) for(j=0;j<m;j++) if(!vis[i][j] && p[i][j]>'0') { vis[i][j]=1; temp.x=i, temp.y=j; q.push(temp); bfs(); cnt++; } printf("%d\n",cnt); } return 0; }