网易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)处提莫种了一个蘑菇.
一个方格可以种无穷个蘑菇.


输出描述:
输出一行,在这一行输出一个整数,代表兰博最多可以清理多少个蘑菇.
#include <vector>
#include <iostream>
using namespace::std ;

void scan( vector<vector<int> > vec, int n, int m, int result[] ) {
    for ( int i = 0; i < n - 2; ++ i ) {
        for ( int j = 0; j < m - 2; ++ j ) {
            int tmp = 0 ;
            for ( int p = i; p < i + 3; ++ p ) {
                for ( int q = j; q < j + 3; ++ q ) {
                    if ( vec[p][q] > 0 )
                    	++ tmp ;
                }
            }
            if ( result[0] < tmp ) {
                result[0] = tmp ;
                result[1] = i ;
                result[2] = j ;
            }
        }
    }
}

int main() {
    int n, m, k ;
    int x, y ;
    
    while ( cin >> n >> m >> k ) {
        if ( n < 3 ) n = 3 ;
        if ( m < 3 ) m = 3 ;
        vector<vector<int>> vec(n, vector<int>( m, 0 )) ;
        while ( k -- ) {
            cin >> x >> y ;
            ++ vec[x - 1][y - 1] ;
        }
        int first[3] = { 0 } ;
        int next[3] = { 0 } ;
        scan( vec, n, m, first ) ;
        for ( int i = first[1]; i < first[1] + 3; ++ i ) {
            for ( int j = first[2]; j < first[2] + 3; ++ j ) {
                if ( vec[i][j] > 0 )
                	-- vec[i][j] ;
            }
        }
        scan( vec, n, m, next ) ;
        cout << first[0] + next[0] << std::endl ;
    }
    return 0 ;
}


第二次做:
#include <vector>
#include <iostream>

using namespace::std ;

void scan( vector<vector<int>>& vec, int result[] ) {
    for ( int i = 0; i < vec.size() - 2; ++ i ) {
        for ( int j = 0; j < vec[0].size() - 2; ++ j ) {
            int tmp = 0 ;
            
            for ( int p = i; p < i + 3; ++ p ) {
                for ( int q = j; q < j + 3; ++ q ) {
                    if ( vec[p][q] > 0 ) ++ tmp ;
                }
            }
            
            if ( result[0] < tmp ) {
                result[0] = tmp ;
                result[1] = i ;
                result[2] = j ;
            }
        }
    }
}

int main() {
    int n, m, k, x, y ;
    
    while ( cin >> n >> m >> k ) {
        if ( n < 3 ) n = 3 ;
        if ( n < 3 ) m = 3 ;
        vector<vector<int>> vec( n, vector<int>( m, 0 ) ) ;
        while ( k -- ) {
            cin >> x >> y ;
            ++ vec[ x - 1][y - 1] ;
        }
        
        int first[3] = { 0 } ;
        int next[3] = { 0 } ;
        
        scan( vec, first ) ;
        
        for ( int i = first[1]; i < first[1] + 3; ++ i ) {
            for ( int j = first[2]; j < first[2] + 3; ++ j ) {
                if ( vec[i][j] > 0 ) -- vec[i][j] ;
            }
        }
        
        scan( vec, next ) ;
        
        cout << first[0] + next[0] << endl ;
    }
    
    return 0 ;
}

第三次做:
#include <iostream>
#include <vector>

using namespace::std ;

void scan( vector<vector<int>>& vec, vector<int>& first ) {
    for ( int i = 1; i < vec.size(); ++ i ) {
        for ( int j = 1; j < vec[0].size(); ++ j ) {
            int tmp = 0 ;
            for ( int n = i; ( n < i + 3 ) && ( n < vec.size() ); ++ n ) {
                for ( int m = j; ( m < j + 3 ) && ( m < vec[0].size() ); ++ m ) {
                    if ( vec[n][m] > 0 ) ++ tmp ;
                }
            }
            if ( tmp > first[2] ) {
                first[0] = i ;
                first[1] = j ;
                first[2] = tmp ;
            }
        }
    }
}

int main() {
    int n, m, k ;
    
    while ( cin >> n >> m >> k ) {
        vector<vector<int>> vec( n + 1, vector<int>( m + 1, 0 ) ) ;
        for ( int i = 0; i < k; ++ i ) {
            int x, y ;
            cin >> x >> y ;
            ++ vec[x][y] ;
        }
        
        vector<int> first( 3, 0 ) ;
        vector<int> next( 3, 0 ) ;
        
        scan( vec, first ) ;
        
        int result = first[2] ;
        for ( int i = first[0]; ( i < first[0] + 3 ) && ( i < vec.size() ); ++ i ) {
            for ( int j = first[1]; ( j < first[1] + 3 ) && ( j < vec[0].size() ); ++ j ) {
                if ( vec[i][j] > 0 ) -- vec[i][j] ;
            }
        }
        
        scan( vec, next ) ;
        result += next[2] ;
        
        cout << result << endl ;
    }
    
    return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值