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代码
题意:
给你一个由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; } }
相关文章推荐
- Spark On Yarn集群环境搭建
- linux下搭建wordpress
- Web前端开发-9
- online_judge_1388
- ThinkPHP3.2版本提交HTTP返回302错误问题
- Java线程基础一
- PCI总线学习
- 1到m的平方和
- 运行locate无法找到mlocate.db的解决方法
- gitstack,不错的windows 版本的git服务器
- 重叠子问题+状压DP(位压缩)(1074)
- Web服务器- apache与nginx分析
- ansible api python joke
- 技术感悟
- python第三方库系列之十九--python測试使用的mock库
- LeetCode - 47. Permutations II
- Codeforces 618A - Slime Combining
- 第2周项目3小试循环
- JavaScript学习笔记
- online_judge_1387