PTA Knowledge

280 阅读1分钟

每个人的学识水平化为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;
}

提交结果: