首师大附中科创教育平台 我的刷题记录 0304 50095106扔核弹(XDC,你懂的)

时间:2023-12-23 09:47:14

今天给大家献上“C”级题:50095106扔核弹(XDC,你懂的)!!

试题编号:0304    
50095106扔核弹(XDC,你懂的)
难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述

21xx年,ussr与us爆发了战争,us想将ussr肢解,于是毫不犹豫的准备使用战略核导弹。你现在正是战略打击部队的司令官,你收到了一幅由卫星发送的加密图片(n*m大小),在这张图片中“.”代表空地,“G”代表敌方军队,“#”代表三防(防核武,防化武,防自然威胁)设施。你的核弹当量极大,可以消灭杀伤范围内所有的暴徒。但你的核弹只能投送到空地上,且如果遇到了三防设施则不再构成杀伤范围(横着一行,竖着一行,碰到三防设施就不构成杀伤范围)。现在你的导弹发射架在(3,3)位置上,为了起到肢解效果,请你输出杀伤暴徒最多的方案,和最多可以杀死暴徒的个数(邪恶......)。

输入
第一行:两个整数n,m。
接下来是一张由“G”“#”“.”所构成的一张图,代表卫星发回的地图。 
输出
一句话如下格式
将导弹投送到(x,y),最多可以消灭z个敌人。
输入示例
13 13
#############
#GG.GGG#GGG.#
###.#G#G#G#G#
#.......#..G#
#G#.###.#G#G#
#GG.GGG.#.GG#
#G#.#G#.#.#.#
##G...G.....#
#G#.#G###.#G#
#...G#GGG.GG#
#G#.#G#G#.#G#
#GG.GGG#G.GG#
#############
输出示例
将导弹投送到(7,11),最多可以消灭10个敌人。
其他说明
LJX认为n与m不会大于26。

好的,以上就是50095106扔核弹(XDC,你懂的)的题目要求,现在献上代码!!!当当当!!!

#include<iostream>
using namespace std;
char a[][];
int maxn=-,book[][],n,m,mx,my;
int res(int i,int j)
{
int sum=,l,b;
l=i;
b=j;
while(a[l][b]!='#')
{
if(a[l][b]=='G') sum++;
b++;
}
l=i;
b=j;
while(a[l][b]!='#')
{
if(a[l][b]=='G') sum++;
b--;
}
l=i;
b=j;
while(a[l][b]!='#')
{
if(a[l][b]=='G') sum++;
l++;
}
l=i;
b=j;
while(a[l][b]!='#')
{
if(a[l][b]=='G') sum++;
l--;
}
return sum;
}
void dfs(int x,int y)
{
int next[][]={{,},
{,},
{,-},
{-,}};
int sum,tx,ty,k;
sum=res(x,y);
if(sum>maxn)
{
maxn=sum;
mx=x;
my=y;
}
for(k=;k<=;k++)
{
tx=x+next[k][];
ty=y+next[k][];
if(tx< || tx>n- || ty< || ty>m-) continue;
if(a[tx][ty]=='.' && book[tx][ty]==)
{
book[tx][ty]=;
dfs(tx,ty);
}
}
return ;
}
int main()
{
int i,startx=,starty=;
cin>>n>>m;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
cin>>a[i][j];
book[startx][starty]=;
maxn=res(startx,starty);
mx=;
my=;
dfs(,);
cout<<"将导弹投送到("<<mx<<","<<my<<"),最多可以消灭"<<maxn<<"个敌人。";
}

50095106扔核弹(XDC,你懂的)!!!!!