[问题描述]
1.题目是这样的:假设有n条道路,每条道路上都需要有路灯,路灯只能照亮左右和自己的位置的三块区域,道路上可能还会有一些障碍(每个占一块区域),求给定一段道路求解至少需要多少的路灯!
假设有一条道,路况是这样的(1000XX200XXX300040005000X6000700X80),. 表示需要照明的地方,X表示这块区域是障碍物,不能被照明。针对这样的道路,我们用肉眼就可以看的出需要8盏灯,我用颜色和序号标出。
那么这个要怎么计算,首先我认为要求出像这样连续的照明区域有多少块(也就是连续这的0有多少个,1个也算连续),在上述例子中有5块这样的区域,每一块对4除法运算+1,会得到这样的区域,因为每块区域至少会1个灯泡,所以加1。所以这样运算的结果就是求得每一块区域的路灯数,然后相加就行了。下图为运算结果,代码附上。
上图:图片好像坏了,应该很好理解的,嗯,就这样。
package test02; import java.awt.List; import java.util.ArrayList; import java.util.Scanner; public class text03 { public static void main(String[] args) { // TODO Auto-generated method stub int load = 0; //总共有load条道路 int query = 0; //每条路有query个方格 String post = null; //存储每条路上的路况 int[] list; //需要的灯泡数目 Scanner scanner1 = new Scanner(System.in); Scanner scanner2 = new Scanner(System.in); Scanner scanner3 = new Scanner(System.in); load = scanner1.nextInt(); list = new int[load]; for(int i=0;i<load;i++){ query = scanner2.nextInt(); post = scanner3.nextLine(); list[i] = text03.Result(query,post); //将灯泡树返回到数组中 } for(int j = 0;j<load;j++) { System.out.println(list[j]); //打印出需要的灯泡数目 } scanner1.close(); scanner2.close(); scanner3.close(); } public static int Result(int query,String post) { int count = 0; //存储连续照明的方块数目 int[] point; //下标表示第几处 int p = 0; //下标的自增 int sum = 0; //灯泡的个数之和 post = post+'X'; //给每条道路最后加一个限制 使得我们的条件成立 point = new int[post.length()]; //初始化数组 int leng = post.length(); for(int i=0;i<leng;i++) { //遍历整个字符串如果 数数 连着点 有几个 并且记住他们的个数. if('X' != post.charAt(i)){ count++; //第p处的连续点数的个数 }else { point[p++] = count; //存到第p处 count = 0; //点数置为0 寻找p+1处的点数 } } for(int y = 0;y<point.length;y++) { //能存进point数组 说明至少有一处是. 也就是至少要有一个灯泡 使用point[y]/3+1 求得y处的需要的灯泡数目 //并且返回sum 存入 if(point[y]!=0) { sum = sum + point[y]/4+1; } } return sum; } }