50095106扔核弹

50095106扔核弹

【试题描述】

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。

【试题分析】

LJX李家鑫小朋友出的数据貌似有点坑,输出的格式在中英文上面很复杂~~~

我们先来看一看怎么求投掷在一个点消灭的敌人吧,当然,四个简单的while就能解决,代码如下:

int res(int i,int j)
{
    int sum=0,l,b;
    l=i;//这里一定不要忘了备份,否则i和j的值以后就不能用了。
    b=j;
    while(a[l][b]!=‘#‘)//当不是三防设施的时候
    {
        if(a[l][b]==‘G‘) sum++;//是敌人,sum加1
        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;//返回结果
}

这就可以了。

然后,暴力搜索一遍:

int main()
{
    for(int i=0;i<n;i++)//枚举每一个点
        for(int j=0;j<m;j++)
        {
             sum=res(i,j);
             ans=max(ans,sum);//如果结果大就替换
        }
     cout<<ans;
}

把这两段代码合起来,再加上声明和头文件and输出格式就对了

对吗?

也许你已经看出漏洞来了,如果只是单单投送到任意空地上的话,那么答案貌似就不是点(7,11)了吧?

可以试着运行一下上面这个程序,还要加上记录点,貌似是右上角那个空地,能消灭11个敌人。

实际上,这还是一个迷宫问题,当然,我们可以用dfs搞定,代码如下:

void dfs(int x,int y)
{
     int next[4][2]={{0,1},//走向数组
                     {1,0},
                     {0,-1},
                     {-1,0}};
     int sum,tx,ty,k;
     sum=res(x,y);//求出打在这里的答案
     if(sum>maxn)//大了的话替换
     {
         maxn=sum;
         mx=x;
         my=y;
     }
     for(k=0;k<=3;k++)
     {
         tx=x+next[k][0];
         ty=y+next[k][1];
         if(tx<0 || tx>n-1 || ty<0 || ty>m-1) continue;//边界判断
         if(a[tx][ty]==‘.‘ && book[tx][ty]==0)//可以走且没走到过
         {
             book[tx][ty]=1;//标记已走
             dfs(tx,ty);//继续行走
         }
     }
     return ;
}

【代码】

#include<iostream>
using namespace std;
char a[50][50];
int maxn=-10000,book[50][50],n,m,mx,my;
int res(int i,int j)
{
    int sum=0,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[4][2]={{0,1},
                     {1,0},
                     {0,-1},
                     {-1,0}};
     int sum,tx,ty,k;
     sum=res(x,y);
     if(sum>maxn)
     {
         maxn=sum;
         mx=x;
         my=y;
     }
     for(k=0;k<=3;k++)
     {
         tx=x+next[k][0];
         ty=y+next[k][1];
         if(tx<0 || tx>n-1 || ty<0 || ty>m-1) continue;
         if(a[tx][ty]==‘.‘ && book[tx][ty]==0)
         {
             book[tx][ty]=1;
             dfs(tx,ty);
         }
     }
     return ;
}
int main()
{
    int i,startx=3,starty=3;
    cin>>n>>m;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            cin>>a[i][j];
    book[startx][starty]=1;
    maxn=res(startx,starty);
    mx=3;
    my=3;
    dfs(3,3);
    cout<<"将导弹投送到("<<mx<<","<<my<<"),最多可以消灭"<<maxn<<"个敌人。";
}
时间: 2024-08-05 11:11:56

50095106扔核弹的相关文章

Node.js 切近实战(八) 之Excel在线(文件权限)

最近美国又他妈的皮痒了,在南海找事,还说什么中国必须接受南海仲裁结果,我去你大爷的,你以为你是谁啊.说实话只要我们要决一死战的勇气,还管什么华盛顿航母,佛吉尼亚潜艇,大不了大家一起死,不,全世界一起死.怎么个死法,中国惹急了先给俄罗斯来几颗核弹,然后俄罗斯反击中国的同时,也会给欧洲扔几颗核弹,给美国扔很多核弹,然后欧洲英法会给其他国家扔核弹,美国给世界扔核弹,俄罗斯只给北冰洋扔就行了,中国给美国和太平洋扔就行了,这样世界就不复存在了. 今天我们来看一下文件权限管理,这个其实是对共享出去的文件的一

大楼扔鸡蛋问题(动态规划)

题目链接:poj 3783 题意分析: 经典题,小白书上的一道例题,4+2出了这道原题,我愣是以为是数学题,最后也没做出来.题意是这样的,给你N个鸡蛋(硬度一样),让你测鸡蛋的硬度,测量的方法就是从某栋M层的楼的某一层X上把鸡蛋扔下来,如果鸡蛋碎了,代表他的强度小于X:如果没碎,则强度大于等于X.我们要做的就是不断的从楼上把鸡蛋扔下来,直到找到某一层楼X,从这一层楼扔下来鸡蛋不碎掉,从X+1层扔下来鸡蛋碎掉,那么鸡蛋的强度就是X.如果在M层扔下来鸡蛋也不碎掉,那么鸡蛋的强度为M.问题是,用N个鸡

把鞋子扔过栅栏

认识他是在一个知青聚会的饭局上. 当时,大家众星捧月般围住他讨要成功的秘笈.其实,刚步入社会时,他和大家一样上山下乡,接受贫下中农的再教育:在知青大返城的洪流中,他同样被一浪打进一家国营厂子里当工人.所不同的是,改革开放之初,他不安于现状,是全县第一个辞去公职,裸身下海去广东捞世界的人.经过30来年的商海打拼,如今,他是广州制鞋业的龙头老大,净资产超过1个亿. 酒至半酣,他娓娓给我们讲了一件他亲历的事:那年我在乡下,一群小男孩要经过一片栅栏拦路的另一边拾麦穗,由于栅栏很高,他们虽然一再努力,却还

因债务起纠纷 男子拿剪刀扔向受害人扎中腹部身亡

债务纠纷引发命案,七里河警方接到报案后,仅用两小时就将卢某抓获.目前,卢某已被刑事拘留. 6月4日中午1时许,武威路一家塑钢门窗厂网络pos内发生一起故意伤害案件.因债务纠纷发生争吵后,卢某拿起剪刀扔向张某,扎中张某腹部,后经抢救无效死亡.下午5时许,民警在兰工坪附近抓获欲逃往岷县的卢某. 因债务起纠纷 男子拿剪刀扔向受害人扎中腹部身亡,布布扣,bubuko.com

【codevs】5833 放置核弹

第一次发 DP or 递推,如果有什么 理解错误 or 理解不透彻 or 有更优解法,嗯,请神犇指出(毕竟我 DP or 递推 很弱)... 题目: 网址:http://codevs.cn/problem/5833/ 大意:n个坑里不能有连续的m个核弹,求方案数 嗯,其实也不难,看到题目第一个想到的就是dfs... 结果数据范围... ... 好吧,dfs TLE... 嗯,记忆化... 嗯,我不会... 那么,好吧,想一下DP or 递推... 思路: 把n个坑分成两部分 第一部分是0(没有放

日本兵书信记录曾杀3万中国人 尸体直接扔长江

日本兵9封家书记录江边杀戮 参与"攻陷南京战役"的日本兵中岛良藏的9封个人书信在现场展出,从另一个角度真实记录了80年前那段历史. 记者了解到,当时日本兵回国,所带各种资料均要经过日本军部审查后才能放行,很多真实的记录就此被抹掉.由于当时的战事正紧,中岛良藏给家人的9封书信并没有寄出,后来,他在战争中死去,这些书信在日本战败后,由其战友带回国内.在交给中岛良藏的家人之前,日本学者仓桥正直有机会复印了这些信件,并将其整理出来.其中,第9封信件中提到,当时中岛良藏看到日军每天在江边杀人,大

[概率]m个球扔到n个盒子

问题描述 有m个球,要扔到n个盒子里.其中每个球都是互相独立地扔.问最后平均有几个盒子是有球的? 问题解析 这类问题是较为纯粹的数学问题,当然也可以用计算机精确地求出答案. 方案一:编程解决 p(m, i):表示前 m 个球,扔到 n 个盒子里,共占用了 i 个盒子的概率 于是 p(m, i) = p(m-1, i) * (i/n) + p(m-1, i-1) * (n-i+1)/n p(m, i) = 0, if i <= 0 || i > m || i > n 于是可以就可以根据上述

香港将公开展示乱扔垃圾者照片

参考消息网4月29日报道 西媒称,中国一直面临严重的环境污染问题.今年早些时候北京的空气污染程度被曝大大超出世界卫生组织建议的标准,现在香港也面临警报.意识到问题严重性的香港民众决心向遍布大街小巷的垃圾宣战,而且将采取全新的方式. 西班牙<阿贝赛报>网站4月27日发表题为<香港将公开展示乱扔垃圾者照片>的文章称,在香港全市范围内推出的“清洁香港”运动中,奥美国际公司联合环保组织和媒体网站推出了“垃圾通缉令”活动,希望能让人们意识到乱扔垃圾的严重后果. 乱扔垃圾者的照片将被张贴在公共

十二核能让联发科引爆核弹战吗?

不可否认的是,智能手机能够迅速普及,与移动互联网的迅速发展和用户的迫切需求有直接关系,但手机厂商在普及过程中的推波助澜也不可忽视.尤其是大肆宣扬多核心,以"多核"为噱头或升级换代地的理由,成为用户不断"喜新厌旧",更换手机的重要原因. 但随着多核安卓智能手机的全面"入侵",如今性能过剩已经成为主旋律,手机厂商更应该关注的是外形设计.材质选择.特色功能.定制系统等方面.不过很显然,扼住手机厂商咽喉的芯片厂商并不这样想.据业内人士@手机晶片达人爆料称