PAT(甲级)1091
作者:互联网
解题思路:flood_fill,由二维变为三维的,解题思路不变,给出DFS和BFS代码进行比较。
注意点:使用DFS会导致最后两个测试点过不了(递归太深,爆栈)
此处应该使用BFS进行搜索
DFS版本(最后两个测试点无法通过):
#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-(x)))
#define ll long long
#define INF 0x3f3f3f3f
#define CLR(a) memset(a, 0, sizeof(a))
using namespace std;
int m,n,l,t;
int cnt;
int board[1300][130][65];
int vis[1300][130][65];
int dx[6]={1,-1,0,0,0,0};
int dy[6]={0,0,1,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
bool check(int x,int y,int z){
if(x<0||y<0||z<0||x>=m||y>=n||z>=l)
return false;
if(vis[x][y][z]||!board[x][y][z])
return false;
return true;
}
void dfs(int x,int y,int z){
if(!check(x,y,z))
return;
cnt++;
vis[x][y][z]=1;
for(int i=0;i<6;i++){
int xx=x+dx[i];
int yy=y+dy[i];
int zz=z+dz[i];
dfs(xx,yy,zz);
}
}
int main() {
cin>>m>>n>>l>>t;
for(int i=0;i<l;i++)
for(int j=0;j<m;j++)
for(int k=0;k<n;k++)
cin>>board[j][k][i];
int ans=0;
for(int i=0;i<l;i++){
for(int j=0;j<m;j++){
for(int k=0;k<n;k++){
cnt=0;
if(board[j][k][i]&&vis[j][k][i]==0){
dfs(j,k,i);
if(cnt>=t){
ans+=cnt;
}
}
}
}
}
cout<<ans<<endl;
return 0;
}
BFS版本(完美通过):
#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-(x)))
#define ll long long
#define INF 0x3f3f3f3f
#define CLR(a) memset(a, 0, sizeof(a))
using namespace std;
int m,n,l,t;
struct node{
int x,y,z;
};
int board[1300][130][65];
int vis[1300][130][65];
int dx[6]={1,-1,0,0,0,0};
int dy[6]={0,0,1,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
bool check(int x,int y,int z){
if(x<0||y<0||z<0||x>=m||y>=n||z>=l)
return false;
if(vis[x][y][z]||!board[x][y][z])
return false;
return true;
}
int bfs(int x,int y,int z){
int cnt=0;
node tmp;
tmp.x=x,tmp.y=y,tmp.z=z;
queue<node> q;
q.push(tmp);
vis[x][y][z]=1;
while(!q.empty()){
node head=q.front();
q.pop();
cnt++;
for(int i=0;i<6;i++){
int xx=head.x+dx[i];
int yy=head.y+dy[i];
int zz=head.z+dz[i];
if(check(xx,yy,zz)&&!vis[xx][yy][zz]){
vis[xx][yy][zz]=1;
tmp.x=xx,tmp.y=yy,tmp.z=zz;
q.push(tmp);
}
}
}
if(cnt>=t)
return cnt;
else
return 0;
}
int main() {
cin>>m>>n>>l>>t;
for(int i=0;i<l;i++)
for(int j=0;j<m;j++)
for(int k=0;k<n;k++)
cin>>board[j][k][i];
int ans=0;
for(int i=0;i<l;i++){
for(int j=0;j<m;j++){
for(int k=0;k<n;k++){
if(board[j][k][i]&&vis[j][k][i]==0){
ans+=bfs(j,k,i);
}
}
}
}
cout<<ans<<endl;
return 0;
}
标签:cnt,return,1091,int,vis,甲级,board,PAT,define 来源: https://blog.csdn.net/qq_42836930/article/details/99695731