您的位置:首页 > 编程语言

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

2016-07-02 19:36 190 查看
[编程题] 扫描透镜

在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
[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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: