PAT 1091 Acute Stroke


这一题的大意是说给出一个三维的矩阵,让我们找上下左右前后相互连通,面积大于等于T的数量,统计最终的面积。

看懂题目后实际上还是比较好写的。

我一开始无脑DFS搜索,找连通块

但写好代码后发现最后两个测试点段错误

DFS代码如下:

cpp 复制代码
#include<bits/stdc++.h>
#include<iostream> 
using namespace std;
int M;
int N;
int L;
//L是一个大脑中片的数量 
int T;
//M,N是每一个片的大小面积
//最大是1286*128
//T是临界值,如果一个量连接核心是少于T那么这个核心一定不被数
 //每一个玻片是由01构成 1代表stroke
 // 0代表正常
 // 因为玻片的厚度是不断的,我们仅仅不得不数1的数量去得到量
 // 然后也许几个分开的核心区域在大脑中,并且仅仅这些量是不少于T
 // 两个轴呗连接因此属于相同的区域,如果它们分享相同的方面 
int t[80][1350][130]; 
int ans;
bool flag[80][1305][135];
void dfs(int x,int y,int z,int& cnt)
{
	if(t[x][y][z]==1)
	{
		cnt++;
	}
	flag[x][y][z]=1;
	if(x+1<L&&y<M&&z<N)
	{
	
	if(t[x+1][y][z]==1&&flag[x+1][y][z]==0)
	{
		dfs(x+1,y,z,cnt);
	}
		
	}
	if(x<L&&y+1<M&&z<N)
	{
		if(t[x][y+1][z]==1&&flag[x][y+1][z]==0)
    	{
		dfs(x,y+1,z,cnt);
	    }
		
	}
	if(x<L&&y<M&&z+1<N)
	{
		if(t[x][y][z+1]==1&&flag[x][y][z+1]==0)
    	{
		dfs(x,y,z+1,cnt);
	    }
	}
	if(x-1>=0&&y<M&&z<N)
	{
		if(t[x-1][y][z]==1&&flag[x-1][y][z]==0)
    	{
		dfs(x-1,y,z,cnt);
	    }
	   
	}
	if(x<L&&y-1>=0&&z<N)
	{
		if(t[x][y-1][z]==1&&flag[x][y-1][z]==0)
    	{
		dfs(x,y-1,z,cnt);
	    }
		
	}
	if(x<L&&y<M&&z-1>=0)
	{
		if(t[x][y][z-1]==1&&flag[x][y][z-1]==0)
    	{
		dfs(x,y,z-1,cnt);
	    }
		
	}
}
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++)
    		{
    			int x;
    			cin>>x;
    			t[i][j][k]=x;
    		
			}
		
		}
	}
	
	 for(int i=0;i<L;i++)
    {
    	for(int j=0;j<M;j++)
    	{
    		for(int k=0;k<N;k++)
    		{
    		
    			if(t[i][j][k]==1&&flag[i][j][k]==0) 
    			{
    				int cnt=0;
    				dfs(i,j,k,cnt);
    			    if(cnt>=T)
    			    {
    				ans+=cnt;
				    }
				}
    			
		
    	
			}
		}
	}
	cout<<ans<<endl;
	
	
    return 0;
}

原因是数据范围过大,dfs递归栈无法开那么大,于是就段错误

因此这一题应该采用BFS,也就是用一个队列来保存

这样就不会递归爆栈了,思路很简单:

完整代码如下:

cpp 复制代码
#include<bits/stdc++.h>
#include<iostream> 
using namespace std;
int M;
int N;
int L;
//L是一个大脑中片的数量 
int T;
//M,N是每一个片的大小面积
//最大是1286*128
//T是临界值,如果一个量连接核心是少于T那么这个核心一定不被数
 //每一个玻片是由01构成 1代表stroke
 // 0代表正常
 // 因为玻片的厚度是不断的,我们仅仅不得不数1的数量去得到量
 // 然后也许几个分开的核心区域在大脑中,并且仅仅这些量是不少于T
 // 两个轴呗连接因此属于相同的区域,如果它们分享相同的方面 
int t[80][1350][130]; 
int ans;
bool flag[80][1305][135];
void dfs(int x,int y,int z,int& cnt)
{
	if(t[x][y][z]==1)
	{
		cnt++;
	}
	flag[x][y][z]=1;
	if(x+1<L&&y<M&&z<N)
	{
	
	if(t[x+1][y][z]==1&&flag[x+1][y][z]==0)
	{
		dfs(x+1,y,z,cnt);
	}
		
	}
	if(x<L&&y+1<M&&z<N)
	{
		if(t[x][y+1][z]==1&&flag[x][y+1][z]==0)
    	{
		dfs(x,y+1,z,cnt);
	    }
		
	}
	if(x<L&&y<M&&z+1<N)
	{
		if(t[x][y][z+1]==1&&flag[x][y][z+1]==0)
    	{
		dfs(x,y,z+1,cnt);
	    }
	}
	if(x-1>=0&&y<M&&z<N)
	{
		if(t[x-1][y][z]==1&&flag[x-1][y][z]==0)
    	{
		dfs(x-1,y,z,cnt);
	    }
	   
	}
	if(x<L&&y-1>=0&&z<N)
	{
		if(t[x][y-1][z]==1&&flag[x][y-1][z]==0)
    	{
		dfs(x,y-1,z,cnt);
	    }
		
	}
	if(x<L&&y<M&&z-1>=0)
	{
		if(t[x][y][z-1]==1&&flag[x][y][z-1]==0)
    	{
		dfs(x,y,z-1,cnt);
	    }
		
	}
}
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++)
    		{
    			int x;
    			cin>>x;
    			t[i][j][k]=x;
    		
			}
		
		}
	}
	
	 for(int i=0;i<L;i++)
    {
    	for(int j=0;j<M;j++)
    	{
    		for(int k=0;k<N;k++)
    		{
    		
    			if(t[i][j][k]==1&&flag[i][j][k]==0) 
    			{
    				int cnt=0;
    				dfs(i,j,k,cnt);
    			    if(cnt>=T)
    			    {
    				ans+=cnt;
				    }
				}
    			
		
    	
			}
		}
	}
	cout<<ans<<endl;
	
	
    return 0;
}
相关推荐
小O的算法实验室20 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生21 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿21 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz21 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能21 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****21 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能21 小时前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能21 小时前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo21 小时前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ021 小时前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法