zoukankan      html  css  js  c++  java
  • [编程题] 扫描透镜(本题还涉及如何从字符串中提取数字)

    在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 }
    View Code

    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
    View Code
  • 相关阅读:
    判断java中两个对象是否相等
    面试题记录
    springboot集成redis操作
    Java 之Integer相等比较
    CSS+DIV网页样式与布局:第二章:CSS的基本语法
    JSP标签:jsp内置标签、jstl标签、自定义标签
    jsp jstl标签库 el表达式
    mysql数据库修改字段类型
    读CSS DIV网页样式与布局心得体会
    Absolute(绝对定位)与relative(相对定位)的图文讲解
  • 原文地址:https://www.cnblogs.com/yuanzhenliu/p/5265282.html
Copyright © 2011-2022 走看看