A1091 Acute Stroke (30分)

一、技术总结

  1. 这一题是BFS广度优先搜索算法,感觉这类题目是首先定义需要的数据结构类型,然后会定义一个数组用于存放数据,还有一个bool类型的数组看是否已经放入队列中了。然后再编写一个判断函数judge()排除数组中超出范围的数字返回false,还有就是不满足条件或者是已经在队列中的,最后就返回true。
  2. 同时也应该定义一个广度扩散的二维或三维数组。
  3. 编写BFS函数,首先定义需要的变量,然后定义一个队列终于记录,把传入的参数赋给数据结构,然后push进入队列中,然后再编写while循环,只要队列不空,就一直,这里也要定义一个队首参数,用于每次取队列首部元素,然后再写一个for循环广度搜索,判断是否符合要求,如果符合要求push进入队列中,该元素设置为true。

二、参考代码

#include<cstdio>
#include<queue>
using namespace std;
struct Node{
	int x, y, z;
}node;
int X[6] = {0, 0, 0, 0, 1, -1};
int Y[6] = {0, 0, 1, -1, 0, 0};
int Z[6] = {1, -1, 0, 0, 0, 0};
int matrix[1290][130][61];
bool inq[1290][130][61] = {false};
int n, m, slice, T;//记录矩阵大小和层数,T是最少的数量?
bool test(int x, int y, int z){
	if(x >= n || x < 0 || y >= m || y <0 || z >= slice || z < 0) return false;
	if(matrix[x][y][z] == 0 || inq[x][y][z] == true) return false; 
	return true;
}
int BFS(int x, int y, int z){
	int tot = 0;
	queue<Node> q;
	node.x = x, node.y = y, node.z = z;
	q.push(node);
	inq[x][y][z] = true;
	while(!q.empty()){
		Node top = q.front();
		q.pop();
		tot++;
		for(int i = 0; i < 6; i++){
			int newx = top.x + X[i];
			int newy = top.y + Y[i];
			int newz = top.z + Z[i];
			if(test(newx, newy, newz)){
				node.x = newx, node.y = newy, node.z = newz;
				q.push(node);
				inq[newx][newy][newz] = true;
			}	
		}
	}
	if(tot >= T) return tot;
	else return 0;
}
int main(){
	scanf("%d%d%d%d", &n, &m, &slice, &T);
	for(int i = 0; i < slice; i++){
		for(int j = 0; j < n; j++){
			for(int k = 0; k < m; k++){
				scanf("%d", &matrix[j][k][i]);
			}
		}
	} 
	int ans = 0;
	for(int i = 0; i < slice; i++){
		for(int j = 0; j < n; j++){
			for(int k = 0; k < m; k++){
				if(matrix[j][k][i] == 1 && inq[j][k][i] == false){
					ans += BFS(j, k, i);
				}
			}
		}
	}
	printf("%d\n", ans);
	return 0;
}
posted @ 2020-02-07 22:46  睿晞  阅读(159)  评论(0)    收藏  举报