原题链接:信息学奥赛一本通T1329-细胞
解题思路:
题目有问题,原题应该是这样。细胞是1到9,而不是11到99.
一矩形阵(n*m)列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(细胞数字指1到9) 0234500067 1034560500 2045600671 0000000089
那么这题就是找到一个细胞,就向上下左右寻找细胞,寻找的地方就标记一下,下次不再寻找,寻找的次数就是细胞的个数。
注意事项:
参考代码:
import java.util.LinkedList; import java.util.Scanner; public class Main { public static int next[][]={{0,1},{1,0},{0,-1},{-1,0}};//下一步 public static int flag[][];//标记是否走过 public static class Q{ int x; int y; public Q(){}; public Q(int _x,int _y){x=_x;y=_y;} } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n=sc.nextInt(); int m=sc.nextInt(); char arr[][]=new char[n][m]; flag=new int[n][m]; //输入 for (int i = 0; i < arr.length; i++) { arr[i]=sc.next().toCharArray(); } //bfs, int count=0;//细胞个数 for (int i = 0; i <n; i++) { for (int j = 0; j <m; j++) { if (arr[i][j]!='0' && flag[i][j]==0) {//开始搜索 flag[i][j]=1; LinkedList<Q> que=new LinkedList<Main.Q>(); que.add(new Q(i,j));//添加首列 bfs(arr, i, j, que);count++;//搜索一次加一次 } } } System.out.println(count); } public static void bfs(char arr[][],int x,int y,LinkedList<Q> que) { while (que.size()!=0) { Q first=que.poll();//取出头列,并删除 for (int i = 0; i <4; i++) { int dx=first.x+next[i][0]; int dy=first.y+next[i][1]; if (dx>=0 && dx<arr.length && dy>=0 && dy<arr[0].length && flag[dx][dy]==0 && arr[dx][dy]!='0') { flag[dx][dy]=1;//标记走过 que.add(new Q(dx,dy)); } } } } }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复