大炮打蚊子pta,C++
时间: 2025-01-12 13:47:13 浏览: 41
### PTA 大炮打蚊子 C++ 解决方案
在处理这个问题时,核心在于理解如何遍历二维数组并计算特定区域内存在的目标数量,在此案例中即为统计被大炮覆盖范围内有多少只蚊子。给定的大炮杀伤范围模式显示为中心点及其上下左右四个方向各一格的位置[^2]。
为了实现这一功能,程序首先读取输入数据,包括网格大小以及各个位置是否有蚊子的信息。接着定义一个函数用于判断指定坐标是否位于有效网格内,并创建另一个函数用来评估当大炮落在某一点上时能击中的蚊子总数。最后通过循环调用上述评估函数找到最佳射击点使得能够消灭最多的蚊子。
下面是具体的C++代码实现:
```cpp
#include <iostream>
using namespace std;
const int MAX_SIZE = 10; // 假设最大尺寸不超过10*10
int grid[MAX_SIZE][MAX_SIZE];
bool visited[MAX_SIZE][MAX_SIZE];
// 判断(x,y)是否处于合法边界内
bool isValid(int x, int y, int m, int n){
return (x >= 0 && x < m && y >= 0 && y < n);
}
// 计算以(i,j)为中心的最大打击效果
int maxKill(int i, int j, int m, int n){
if (!isValid(i, j, m, n)) return 0;
int killCount = 0;
static const pair<int,int> directions[]={
make_pair(-1,-1),make_pair(-1,0),make_pair(-1,+1),
make_pair(0,-1), make_pair(0,+1),
make_pair(+1,-1),make_pair(+1,0),make_pair(+1,+1)
};
for(auto& dir : directions){
int newX=i+dir.first,newY=j+dir.second;
if(isValid(newX,newY,m,n)){
killCount+=grid[newX][newY];
}
}
return killCount + grid[i][j]; // 加上中心点本身
}
void solve(){
int m, n;
cin >> m >> n;
char c;
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
cin>>c;
grid[i][j]=(c=='1'?1:0); // 将字符转换成整数表示有无蚊子
}
}
int bestI=-1,bestJ=-1,maxKills=INT_MIN;
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
int current=maxKill(i,j,m,n);
if(current>maxKills){
maxKills=current;
bestI=i;
bestJ=j;
}
}
}
cout << "Best position ("<<bestI<<","<<bestJ<<") kills "<<maxKills<<" mosquitoes."<<endl;
}
```
这段代码实现了对于给定的`m*n`矩阵,其中每个元素代表是否存在一只蚊子(用‘1’或‘0’表示),可以找出最有效的攻击位置使一次爆炸尽可能多地清除掉更多的蚊子。注意这里假设了地图不会超过10乘10的规模;如果实际应用场景中有更大的需求,则需调整常量`MAX_SIZE`的值。
阅读全文
相关推荐













