[编程题] 扫描透镜(本题还涉及如何从字符串中提取数字)

在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

时间: 2024-10-29 19:09:59

[编程题] 扫描透镜(本题还涉及如何从字符串中提取数字)的相关文章

编程题:输入英文月份单词,输出对应月的数字形式。

#include<stdio.h> #include<string.h> int search(char list[][20],char name[],int m) { int i; for(i=0;i<m;i++) if(strcmp(list[i],name)==0) break; return i; } void main() { char month_list[12][20]={"January","February",&quo

编程题:用函数调用实现,求两个数中的最小数。

#include<stdio.h> void main() { float min(float x,float y);  /*函数定义在调用的函数之后,要先声明*/ float a=3,b=4.1; printf("%.1f\n",min(a,b)); printf("%.1f\n",min(5,a*b)); printf("%.1f\n",min(b-1,min(a,b))); } float min(float x,float y

笔试算法题(30):从已排序数组中确定数字出现的次数 &amp; 最大公共子串和最大公共序列(LCS)

出题:在已经排序的数组中,找出给定数字出现的次数: 分析: 解法1:由于数组已经排序,所以可以考虑使用二分查找确定给定数字A的第一个出现的位置m和最后一个出现的位置n,最后m-n+1就是A出现的次数:使用二分查找可疑快速确定给定数字,但是如果确定其左右范围则比较麻烦,对编码细节要求较高: 解法2:HashTable解决 解题: 1 int occurrence(int *array, int length, int t) { 2 /** 3 * 寻找t所在的区间 4 * 此阶段之后left和ri

微软校招编程题&quot;Beautiful String&quot;的状态机解法

昨天碰巧看到一道微软校招的编程题,题目大意如下: 如果一个字符串包括三组或者更多组的连续升序字母,每组长度相等,那么我们就称这个字符串是Beautiful String 如下是一些Beautiful String的例子: abc.cde.aabbcc.aaabbbccc 这些不是Beautiful String: abd.cba.aabbc.zab 输入一个只含有小写字母的字符串,如果它含有一个Beautiful的子串,就输出YES,否则输出NO 输入: 第一行是案例个数,之后的每一行是一个数字

1.虎牙直播2019秋招编程题

第一题: #include <iostream> #include <string> using namespace std; bool IsVoChar(char c) { return (c == 'a') || (c == 'e') || (c == 'o') || (c == 'i') || (c == 'u') || (c == 'A') || (c == 'E') || (c == 'O') || (c == 'I') || (c == 'U'); } string r

[编程题-网易]扫描透镜

在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇?注意:每个方格被扫描一次只能清除掉一个蘑菇. 输入描述: 第一行三个整数:N,M,K,(1≤N,M≤20,K≤100),N,M代表了草地的大小; 接下来K行,每行两个整数x,y(1≤x≤N,1≤

网易2016研发工程师编程题:扫描透镜

扫描透镜 在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)处提莫种了

慕课编程题JS选项卡切换

Javascript进阶篇的最后一节是一个选项卡切换的编程,要求效果如下. 这里涉及到两块,一个是内容的切换显示,一个是红色的边框样式切换. 内容切换可以用纯js代码实现,但当这里还需设置一个红色边框样式的时候,JS里会出现大量CSS代码,所以统一使用className切换是更好的选择,不同的class样式可以在CSS文件中设置.这样JS的任务只剩下区分onclick元素和其他元素这一项了. 我的第一反应是给<p>内容部分加上房产/家居/二手房的id,通过if判断id是否与触发onclick选

[编程题] 四则运算

[编程题] 四则运算 题目描述 请实现如下接口 /* 功能:四则运算 * 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}" * 返回:算术表达式的计算结果 */ public static int calculate(String strExpression) { /* 请实现*/ return 0; } 约束: pucExpression字符串中的有效字符包括['0'-'9'],'+','-', '*','/' ,'('