PAT A1091 Acute Stroke
- 题不太好读,比较吓人的样子,然而方法就是存入三维数组,然后对每一个没有访问过的点1做bfs(扫描上下前后左右的1入队),如果本次bfs的cnt值>=T,则累加入结果
- 注意想好visited置位和cnt++的时机,否则就会多算或者少算,调试也比较麻烦
- 把visited也弄成三维的,q里面push三维坐标的结构体应该能节省一些脑细胞
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/bdb60a932d5e63122405b8c3d46a7e73.jpeg)
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <stack>
using namespace std;
#define MAXM 1286
#define MAXN 128
#define MAXL 60
#define INF 999999999
int G[MAXL][MAXM][MAXN];
bool visited[MAXL * MAXM * MAXN] = {false};
queue<int> q;
int Xoffset[] = {0,0,0,0,1,-1};
int Yoffset[] = {0,0,1,-1,0,0};
int Zoffset[] = {1,-1,0,0,0,0};
int total = 0;
#define DEBUG 1
int main(){
#ifdef DEBUG
freopen("1.txt","r",stdin);
#endif
int M,N,L,T;
cin >> M >> N >> L >> T;
fill(G[0][0],G[0][0] + MAXL * MAXM * MAXN,INF);
fill(visited,visited + MAXL * MAXM * MAXN,false);
for(int i = 0;i < L;i ++){
for(int j = 0;j < M;j ++){
for(int k = 0;k < N;k ++){
scanf("%d",&G[i][j][k]);
}
}
}
for(int i = 0;i < L;i ++){
for(int j = 0;j < M;j ++){
for(int k = 0;k < N;k ++){
if(G[i][j][k] != 1) continue;
int start = i * MAXM * MAXN + j * MAXN + k;
if(visited[start]) continue;
int cnt = 0;
q.push(start);
visited[start] = true;
while(!q.empty()){
int now = q.front();
q.pop();
cnt ++;
int nowx = now % MAXN;
int nowy = (now % (MAXM * MAXN)) / MAXN;
int nowz = now / (MAXM * MAXN);
for(int v = 0;v < 6;v ++){
int testx = Xoffset[v] + nowx;
if(testx < 0 || testx >= N) continue;
int testy = Yoffset[v] + nowy;
if(testy < 0 || testy >= M) continue;
int testz = Zoffset[v] + nowz;
if(testz < 0 || testz >= L) continue;
int pos = testz * MAXM * MAXN + testy * MAXN + testx;
if(!visited[pos] && G[testz][testy][testx] == 1){
q.push(pos);
visited[pos] = true;
}
}
}
if(cnt >= T) total += cnt;
}
}
}
cout << total;
return 0;
}