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

在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

 

posted @ 2016-03-11 13:21  YoZane  阅读(610)  评论(0编辑  收藏  举报