小码哥正在研究传染病的相关知识,现在遇到了这么—个问题:
有一个长为n,宽为m,高为k (层数)的长方体,它可以看成n x m ×k个1x1×1大小的单位正方体。每个单位正方体都有一个字符。"”表示该位置防疫措施不好,如果被传染了就会感染病毒。”#”表示该区人民防疫措施良好,永远不会感染病毒(甚至都不会成为病毒的携带者)。
现在在长方体的最顶层(层号为1)某个位置,因实验室泄露爆发了病毒。每过一个单位时间,病毒将扩散至周围6个方向的地区。如果某个地区为”#”,那么一定不会被感染并且不会携带病毒同时也不会传播病毒。(但如果这个地方存在泄露的实验室,那么哪怕防疫措施再好也会被感染以及传播病毒)
现在小码哥需要知道,假如第一层坐标为(a,g)的实验室泄露了病毒,那么最多会有多少区域被感染。
输入格式:第一行三个正整数k,n,m ( k, n, m ≤10 )
接下来k层,每层n行,每行m个字符,表示长方体每个单位的状态
最后一行两个正整数x,y ( z ≤n,y≤m )表示发生泄漏的实验室的坐标(这个实验室在第一层)
输出格式:按题目要求输出一行一个整数表示答案。
输入
3 3 3
.#.
###
##.
.##
###
##.
…
…
…
1 1
解题思路输出: 13
- 解法一:暴力扫描
- flag标记变量记录是否有新的感染发生
- while(1) 无限循环,直到没有新的感染发生
- 每一层横向+纵向扫描,层与层之间扫描
#includeusing namespace std; char sites[13][13][13]; int pp[13][13][13]={0}; int main( ) { int k,n,m,x,y,count=0; char site_c; cin>>k>>n>>m; for(int i=0;i for(int j=0;j for(int h=0;h cin>>site_c; sites[i][j][h]=site_c; } } } cin>>x>>y; sites[0][x-1][y-1]='x';// 初始感染位置 int flag=1;// 标记是否还有感染发生 while(1){ flag=1; for(int i=0;i // 每层横向扫描 for(int j=0;j for(int h=0;h if(sites[i][j][h]=='x'){ if(h-1>=0){ if(sites[i][j][h-1]=='.'){ pp[i][j][h-1]=1; flag=0; } } if(h+1 if(sites[i][j][h+1]=='.'){ pp[i][j][h+1]=1; flag=0; } } } } } // 每层纵向遍历 for(int j=0;j for(int h=0;h if(sites[i][j][h]=='x'){ if(j-1>=0){ if(sites[i][j-1][h]=='.'){ pp[i][j-1][h]=1; flag=0; } } if(j+1 if(sites[i][j+1][h]=='.'){ pp[i][j+1][h]=1; flag=0; } } } } } // 层次遍历 for(int j=0;j for(int h=0;h if(sites[i][j][h]=='x'){ if(i-1>=0){ if(sites[i-1][j][h]=='.'){ pp[i-1][j][h]=1; flag=0; } } if(i+1 if(sites[i+1][j][h]=='.'){ pp[i+1][j][h]=1; flag=0; } } } } } } // 改变感染位置标识 for(int i=0;i for(int j=0;j for(int h=0;h if(pp[i][j][h]==1){ sites[i][j][h]='x'; } } } } if(flag==1) break; } for(int i=0;i for(int j=0;j for(int h=0;h // cout<
- 解法2
深度优先搜索
#include#include using namespace std; vector >> vec_g(11,vector >(11,vector (11,' '))); // 记录实验室情况 vector >> vec_f(11,vector >(11,vector (11,false))); // 记录感染情况 // 搜索方向 vector direction_x={1,-1,0,0,0,0}; vector direction_y={0,0,1,-1,0,0}; vector direction_z={0,0,0,0,1,-1}; int ans=0; void dfs(int z,int x,int y){ ++ans; vec_f[z][x][y]=true; for(int i=0;i<6;++i){ // for循环单层6个方向的搜索 int dx=x+direction_x[i]; int dy=y+direction_y[i]; int dz=z+direction_z[i]; if(dx>=0&&dx<11&&dy>=0&&dy<11&&dz>=0&&dz<11) if(vec_f[dz][dx][dy]==false&&vec_g[dz][dx][dy]=='.') dfs(dz,dx,dy); } } int main(){ int k,n,m,x,y; cin>>k>>n>>m; for(int i=0;i for(int j=0;j for(int z=0;z // scanf("%c",&vec_g[i][j][z]); cin>>vec_g[i][j][z]; } } } cin>>x>>y; dfs(0,x-1,y-1); cout<



