题意简述:
思路:
一个简单的广搜,只要设置方向为三维即可。
代码:(注释很全)
#include<cstdio>//建议不用万能头,提高效率
#include<queue>//广搜必备的数据结构
using namespace std;
int n,m,k;//k层数,n长,m宽
int ans;
int sx,sy;//输入的第一层的x,y坐标
int dx[6]={0,0,0,0,1,-1};//x方向
int dy[6]={0,0,1,-1,0,0};//y方向
int dh[6]={1,-1,0,0,0,0};//h方向
char a[15][15][15];//记录地图
char read(){//快读char
char ch=getchar();
while(ch!='.'&&ch!='#')ch=getchar();//如果不是地图中出现的字符,则说明输入了换行或空格
return ch;
}
signed main(){
scanf("%d%d%d",&k,&n,&m);
for(int a1=1;a1<=k;a1++)
for(int a2=1;a2<=n;a2++)
for(int a3=1;a3<=m;a3++)
a[a1][a2][a3]=read();//用read读入,可以提高效率。
scanf("%d%d",&sx,&sy);
queue<int> qx,qy,qh;
qh.push(1);
qx.push(sx);
qy.push(sy);
a[1][sx][sy]='#';//标记为访问过,防止重复
while(!qx.empty()){//广搜框架
int h=qh.front(),x=qx.front(),y=qy.front();
qx.pop(),qy.pop(),qh.pop();//出队
++ans;//统计答案
for(int i=0;i<6;i++){
int th=h+dh[i],tx=x+dx[i],ty=y+dy[i];
if(th<=k&&th>=1&&tx>=1&&tx<=n&&ty>=1&&ty<=m&&a[th][tx][ty]=='.'){//不出界并且可以访问
qh.push(th);
qx.push(tx);
qy.push(ty);
a[th][tx][ty]='#';//在这里标记,可避免TLE和MLE!!!(血泪的教训)
}
}
}
printf("%d",ans);//输出答案
return 0;//不要用Ctrl+C+V,做诚信的人。
}
//再见!