您的位置:首页 > 其它

PAT1004-Acute Stroke (30)

2016-03-08 19:43 441 查看
PAT上出现运行错误,一般是数组出错,注意检查数组。

题意:

给你一个由0和1组成的三维的数组,计算每个由1填充的连通区域中的1的个数,连通的概念可以很容易从题目中那幅图理解,如果个数大于给定的t就将这一区域中的1的个数累加到最终的ans中,最后输出ans,感觉这道题目最难的根本不是编程,而是生词太多。解决的方法无外乎DFS和BFS两种。解法是对每个含有1的点进行搜索,搜索的时候注意不要越界就好了。

解答:

此处采用BFS,三维数组的BFS采用的是,三个方向上的位移用dx,dy,dz三个数组表示,

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};

这里这样就可以实现(1.0.0),(0.1.0),(0.0.1)........就可以实现遍历三维数组的全部情况。这就相当于一般BFS中遍历所有顶点给顶点找邻接点一样的道理。
还需要注意的是数组

a*b,a是列,b是横

a*b*c是a个b*c二维数组

具体java代码

import java.util.*;
public class Main{
static int ans=0;
static int[][][] brain;
static int T;
static int M;
static int N;
static int L;
static Queue<Location> q=new LinkedList();
static int[] dx={1,-1,0,0,0,0};
static int[] dy={0,0,1,-1,0,0};
static int[] dz={0,0,0,0,1,-1};
public static void main(String[] args){
Scanner in=new Scanner(System.in);
M=in.nextInt();
N=in.nextInt();
L=in.nextInt();
T=in.nextInt();
brain = new int[M]
[L];
for(int k=0;k<L;k++){
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
brain[i][j][k]=in.nextInt();
}
}
}
in.close();
for(int k=0;k<L;k++){
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
bfs(i,j,k);
}
}
}
System.out.print(ans);
}
public static void bfs(int x,int y,int z){
if(brain[x][y][z]==1){
q.add(new Location(x,y,z));
brain[x][y][z]=0;
int res=1;
while(!q.isEmpty()){
Location temp=q.poll();
for(int i=0;i<6;i++){
int nx=temp.x+dx[i];
int ny=temp.y+dy[i];
int nz=temp.z+dz[i];
if(inRange(nx,ny,nz)&&brain[nx][ny][nz]==1){
brain[nx][ny][nz]=0;
res++;
q.add(new Location(nx,ny,nz));
}
}

}
if(res>=T)
ans+=res;
}
}
public static boolean inRange(int x,int y,int z){
return x>=0&&x<M&&y>=0&&y<N&&z>=0&&z<L;
}
}
class Location{
int x,y,z;
public Location(int x,int y,int z){
this.x=x;
this.y=y;
this.z=z;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: