[编程题] 扫描透镜(本题还涉及如何从字符串中提取数字)
Posted yuanzhenliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[编程题] 扫描透镜(本题还涉及如何从字符串中提取数字)相关的知识,希望对你有一定的参考价值。
在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇?
输入描述:
第一行三个整数:N,M,K,(1≤N,M≤20,K≤100),N,M代表了草地的大小; 接下来K行,每行两个整数x,y(1≤x≤N,1≤y≤M).代表(x,y)处提莫种了一个蘑菇. 一个方格可以种无穷个蘑菇.
输出描述:
输出一行,在这一行输出一个整数,代表兰博最多可以清理多少个蘑菇.
java
1 import java.util.Scanner; 2 import java.util.regex.Matcher; 3 import java.util.regex.Pattern; 4 public class ex3{ 5 ex3(){} 6 public static void main(String[] argvs){ 7 Scanner scanner = new Scanner(System.in); 8 String str = scanner.nextLine(); 9 10 //从字符串中提取数字 11 String regEx = "\\d{1,}"; 12 Pattern p = Pattern.compile(regEx); 13 Matcher m = p.matcher(str); 14 int iii = -1; 15 int[] t = new int[3]; 16 while(m.find()){ 17 iii++; 18 if(iii>2) 19 break; 20 t[iii] =new Integer(m.group()).intValue(); 21 } 22 int N =t[0]; 23 int M =t[1]; 24 int K =t[2]; 25 int x,y; 26 int[][] map = new int[N+1][M+1]; 27 for(int i=0;i<K;i++){ 28 str = scanner.nextLine(); 29 m = p.matcher(str); 30 iii = -1; 31 while(m.find()){ 32 iii++; 33 if(iii>1) 34 break; 35 t[iii] =new Integer(m.group()).intValue(); 36 } 37 x = t[0]; 38 y = t[1]; 39 map[x][y] = 1; 40 } 41 int[][] book = new int[N+1][M+1]; 42 int max = 0; 43 int s1,s2; 44 for(int i=1;i<N-1;i++){ 45 for(int j=2;j<M;j++){ 46 s1 = 0; 47 for(int k=-1;k<2;k++){//第一个镜子扫描 48 for(int l = -1 ; l < 2 ; l++){ 49 s1 += map[i+k][j+l]; 50 book[i+k][j+l] = -2; 51 } 52 } 53 for(int ii = 1 ; ii < N-1 ; ii++){ 54 for(int jj = 2 ; jj < M ;jj++){ 55 if(ii != i || jj != j){ 56 s2 = 0; 57 for(int k = -1 ; k < 2 ; k++){ 58 for(int l = -1 ;l < 2 ;l++){ 59 if(book[ii+k][jj+l] == 0){ 60 s2 += map[ii+k][jj+l]; 61 } 62 } 63 } 64 if((s1 + s2) > max){ 65 max = s1 + s2; 66 } 67 } 68 } 69 } 70 for(int k=-1;k<2;k++){//第一个镜子扫描book复原 71 for(int l = -1 ; l < 2 ; l++){ 72 book[i+k][j+l] = 0; 73 } 74 } 75 } 76 } 77 System.out.println(max); 78 return; 79 } 80 }
python
#-*- coding:utf-8 -*- str = raw_input() li = str.split(‘ ‘) M = li[0] N = li[1] K = li[2] M,N,K = int(M),int(N),int(K) map = [i for i in range(M*N+1)] book = [i for i in range(M*N+1)] for i in range(0,N): for j in range(1,M+1): map[i*M+j] = 0 for i in range(K): str = raw_input() li = str.split(‘ ‘) x,y = li[0],li[1] x,y = int(x),int(y) map[(x-1)*M+y] = 1 for i in range(1,M*N+1): book[i] = -1 max = 0 for i in range(1,N-1): for j in range(2,M): s1 = 0 for k in range(-1,2):#第一个镜子扫描 for l in range(-1,2): s1 += map[(i+k)*M+j+l] book[(i+k)*M+j+l] = -2 #表示访问过 for ii in range(1,N-1): for jj in range(2,M): if ii*M+jj != i*M + j: s2 = 0 for k in range(-1,2):#第二个镜子扫描 for l in range(-1,2): if book[(ii+k)*M+jj+l] == -1: s2 += map[(ii+k)*M+jj+l] if s1 + s2 > max: max = s1 + s2 for t in range(1,M*N+1): book[t] = -1 print ‘max:‘,max
以上是关于[编程题] 扫描透镜(本题还涉及如何从字符串中提取数字)的主要内容,如果未能解决你的问题,请参考以下文章