题目链接:http://codevs.cn/problem/3492/
题目描述 Description
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如阵列:
0234500067
1034560500
2045600671
0000000089
有4个细胞。
输入描述 Input Description
【输入格式】
整数m,n
(m行,n列)矩阵
输出描述 Output Description
【输出格式】
细胞的个数。
样例输入 Sample Input
4 10
0234500067
1034560500
2045600671
0000000089
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
1<=m,n<=1000
题目分析:
首先,题目描述的数据格式跟后台检测的数据格式不一致。后台检测的数据格式类似于下面:
4 10
0 2 3 4 5 0 0 0 6 7
1 0 3 4 5 6 0 5 0 0
2 0 4 5 6 0 0 6 7 1
0 0 0 0 0 0 0 0 8 9
所以,输入数据时应该要用int数组直接保存即可,不是用char数组保存。
【算法分析】
⑴从文件中读入m*n矩阵阵列,将其转换为bool矩阵存入b数组中;
⑵沿b数组矩阵从上到下,从左到右,找到遇到的第一个细胞;
⑶将细胞的位置入队h,并沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置b数组置为flase;
⑷将h队的队头出队,沿其上、下、左、右四个方向上的细胞位置入队,入队后的位置b数组置为flase;
⑸重复4,直至h队空为止,则此时找出了一个细胞;
⑹重复2,直至矩阵找不到细胞;
⑺输出找到的细胞数。
AC代码:
1 #include<iostream> 2 #include<stdio.h> 3 #include<queue> 4 using namespace std; 5 int main(int argc, char *argv[]) 6 { 7 queue<int> qx,qy; 8 int n,m,i,j,x,y; 9 int a[1002][1002]; 10 int count=0;//细胞个数 11 12 scanf("%d%d",&n,&m); 13 for(i=0;i<n;i++) 14 { 15 for(j=0;j<m;j++) 16 { 17 scanf("%d",&a[i][j]); 18 //printf("%d ",a[i][j]); 19 } 20 //printf("\n"); 21 } 22 23 for(i=0;i<n;i++) 24 { 25 for(j=0;j<m;j++) 26 { 27 if(a[i][j]!=0) 28 { 29 qx.push(i); qy.push(j); 30 a[i][j]=0; 31 while(!qx.empty()) 32 { 33 x=qx.front(); qx.pop(); 34 y=qy.front(); qy.pop(); 35 36 if(y+1<m&&a[x][y+1]!=0)//当前坐标x,y的右边 37 { 38 qx.push(x); qy.push(y+1); 39 a[x][y+1]=0; 40 } 41 if(x+1<n&&a[x+1][y]!=0)//当前坐标x,y的下边 42 { 43 qx.push(x+1); qy.push(y); 44 a[x+1][y]=0; 45 } 46 if(y-1>=0&&a[x][y-1]!=0)//当前坐标x,y的左边 47 { 48 qx.push(x); qy.push(y-1); 49 a[x][y-1]=0; 50 } 51 if(x-1>=0&&a[x-1][y]!=0)//当前坐标x,y的上边 52 { 53 qx.push(x-1); qy.push(y); 54 a[x-1][y]=0; 55 } 56 } 57 count++; 58 } 59 } 60 } 61 printf("%d\n",count);/**/ 62 return 0; 63 }