每个人的学识水平化为0-9,用0~9表示其学识高低程度。众所周知,与新生婴儿讨论微积分是一个非常扯淡的事情,所以,学识不为0的人群才可以参与讨论, 现在给定一个m*n的人群,给定每个人的文化程度,每个人仅可和上下左右进行讨论,所以请你求出学术讨论组的个数。
输入格式:
用空格隔开的整数m,n(m行,n列)矩阵(1≤m,n≤100)。
输出格式:
学识组的个数。
输入样例:
在这里给出一组输入。例如:
4 10
0674800011
1034560500
0039600651
0000000098
结尾无空行
输出样例:
在这里给出相应的输出。例如:
4
结尾无空行
代码:
#include<string>
#include<iostream>
using namespace std;
int a[100 * 100]; //数组存储数据
int b[100 * 100]; //访问标志数组
int row, col;
int l; //数组大小
int ncount = 0; //学习小组个数
struct queue {
int front;
int rear;
int c[10000];
}Q;//队列
string str; //字符串用于输入到数组中
int find_first_nzero() {
int i;
for (i = 0; i < l && (b[i] || a[i] == 0); i++);
return i;
}
bool calculate() {
int div;
int front_pos;
int first_pos = find_first_nzero();
if (first_pos == l) return false; //第一个非零元在长度范围内没有找到,大循环结束
Q.front = Q.rear = 0;
Q.c[Q.rear++] = first_pos;
b[first_pos] = 1;
while (Q.front != Q.rear) { //广度优先遍历
front_pos = Q.c[Q.front++];
div = front_pos / col; //表示所在行
//看右边
if ((front_pos + 1 < (div + 1) * col) && (a[front_pos + 1] != 0) && (!b[front_pos + 1])) {
Q.c[Q.rear++] = front_pos + 1;
b[front_pos + 1] = 1;
}
//看左边
if ((front_pos - 1 >= div * col) && (a[front_pos - 1] != 0) && (!b[front_pos - 1])) {
Q.c[Q.rear++] = front_pos - 1;
b[front_pos - 1] = 1;
}
//看下面
if ((front_pos + col < l) && (a[front_pos + col] != 0) && (!b[front_pos + col])) {
Q.c[Q.rear++] = front_pos + col;
b[front_pos + col] = 1;
}
//看上面
if ((front_pos - col > 0) && (a[front_pos - col] != 0) && (!b[front_pos - col])) {
Q.c[Q.rear++] = front_pos - col;
b[front_pos - col] = 1;
}
}
return true;
}
int main()
{
//input
cin >> row >> col;
l = row * col;
for (int i = 0; i < row; i++) {
cin >> str;
for (int j = 0; j < str.size(); j++) {
a[i * col + j] = str[j] - '0';
}
}
while (calculate()) {
ncount++;
}
cout << ncount << endl;
return 0;
}