A1091 Acute Stroke (30分)

Posted tsruixi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
", ans);
    return 0;
}

以上是关于A1091 Acute Stroke (30分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT A1091 Acute Stroke

PAT甲级1091 Acute Stroke (30分)

1091 Acute Stroke (30 分)难度: 一般 / bfs

PAT 1091 Acute Stroke [难][bfs]

PAT甲级——1091 Acute Stroke (广度优先搜索BFS)

1091. Acute Stroke (30)搜索——PAT (Advanced Level) Practise