题目描述
小T在上电脑课的时候,写了一个游戏。
游戏的内容是:在n*n的矩阵里,有若干个敌人。你可以选择一个 没有敌人 的位置放置激光炮,激光炮会朝左上角和左下角两个方向发射激光,能消灭与激光炮距离为1的敌人。
目前只能部署一次激光炮,请问把激光炮放置在哪个位置上消灭的敌人数量最多。
输入格式
第一行一个正整数 n ,表示矩阵的大小。
接下来 n 行,每行 n 个整数 x (0≤x≤9),表示敌人的数量。
输出格式
一个整数,表示最多能消灭的敌人数量。
遍历所有0的位置,统计左上和左下格的数值和,取最大值
#include <stdio.h>
int a[1000][1000];
int main()
{
int n,i,j,max=0,e=0;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
for(j=1;j<n;j++)
{
if(a[i][j] == 0)
{
e = 0;
if(i>0)
e += a[i-1][j-1];
if(i<n-1)
e += a[i+1][j-1];
if(e > max)
max = e;
}
}
printf("%d",max);
}
遍历所有敌人数量为0的节点,计算每个点左下角和左上角敌人的和,求最大值就可以。
需要注意的是,保存敌人数量的二维数组,如果用int a[1000][1000],在部分编译器中可能导致占用缓存过大而导致程序崩溃。因为每个点的敌人数量小于等于9,所以,可以用char a[1001][1001]来保存。
运行结果:
C代码:
#include <stdio.h>
int main()
{
char a[1001][1001] = {0};
int i, j, n;
int max = 0; //记录消灭的最大敌人数量
int t;
scanf("%d",&n); //输入n
//输入各位置敌人的数量
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &t);
a[i][j] = t;
}
}
//遍历所有敌人数量为的0的位置
for (i = 0; i < n; i++)
{
for (j = 1; j < n; j++) //因为第0列左上角和左下角没有敌人,所以j从1开始就可以
{
if (a[i][j] == 0)
{
t = 0; //记录该位置能消灭敌人的数量
if (i == 0) //第一行,仅考虑左下角
{
t = a[i + 1][j - 1];
}
else if (i == n - 1) //最后一行,仅考虑左上角
{
t = a[i - 1][j - 1];
}
else //其它行
{
t = a[i - 1][j - 1] + a[i + 1][j - 1]; //左上角+左下角
}
if (t > max)
max = t; //如果t比max大,更新max
}
}
}
printf("%d", max);
return 0;
}
C++代码:
#include <iostream>
using namespace std;
int main()
{
char a[1001][1001] = {0};
int i, j, n;
int max = 0; //记录消灭的最大敌人数量
int t;
cin >> n; //输入n
//输入各位置敌人的数量
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
cin >> t;
a[i][j] = t;
}
}
//遍历所有敌人数量为的0的位置
for (i = 0; i < n; i++)
{
for (j = 1; j < n; j++) //因为第0列左上角和左下角没有敌人,所以j从1开始就可以
{
if (a[i][j] == 0)
{
t = 0; //记录该位置能消灭敌人的数量
if (i == 0) //第一行,仅考虑左下角
{
t = a[i + 1][j - 1];
}
else if (i == n - 1) //最后一行,仅考虑左上角
{
t = a[i - 1][j - 1];
}
else //其它行
{
t = a[i - 1][j - 1] + a[i + 1][j - 1]; //左上角+左下角
}
if (t > max)
max = t; //如果t比max大,更新max
}
}
}
cout << max;
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<vector<int>> grid(n, vector<int>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> grid[i][j];
}
}
int max_killed = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] != 0) { // 如果这个位置上有敌人,不能放置激光炮
continue;
}
int killed = 0;
// 向左上方向遍历
int x = i - 1, y = j - 1;
while (x >= 0 && y >= 0) {
if (grid[x][y] == 1) {
killed++;
}
x--, y--;
}
// 向左下方向遍历
x = i + 1, y = j - 1;
while (x < n && y >= 0) {
if (grid[x][y] == 1) {
killed++;
}
x++, y--;
}
// 更新最大值
max_killed = max(max_killed, killed);
}
}
cout << max_killed << endl;
return 0;
}
这题我都看不懂
“激光炮会朝左上角和左下角两个方向发射激光,能消灭与激光炮距离为1的敌人”
别管往哪个方向发射,这里只发射2束激光没错吧
而且只能消灭距离1的敌人,也就是说不能穿透整行
那满打满算最多每条激光只能消灭一个敌人,答案3是怎么来的?