炸弹人游戏
一、游戏规则
你只有一枚炸弹,但是这枚炸弹威力超强(杀伤距离超长,可以消灭杀伤范围内所有的敌人)。请问在哪里放置炸弹才可以消灭最多的敌人?
二、题目分析
- 我们先将这个地图模型化。墙用#表示,敌人用G表示,空地用 . 表示(当然如果你想换成其他的符号也可以),炸弹只能放在空地上。
#############
#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#
#############
- 首先我们需要用一个二维字符数组来存储这个地图
- 分别统计上下左右四个方向上可以消灭的敌人数
向另外几个方向进行统计的坐标变化如下:
注意,坐标(x,y)指的是第x行第y列。
//向上统计可以消灭的敌人数 while(a[x][y]!='#') //判断是不是墙,如果不是墙就继续 { if(a[x][y]=='G') //如果当前点是敌人 sum++; //计数 x--; //否则继续向上统计 }
//向下统计可以消灭的敌人数 while(a[x][y]!='#') { if(a[x][y]=='G') sum++; x++; //继续向下统计 }
//向左统计可以消灭的敌人数 while(a[x][y]!='#') { if(a[x][y]!='G') sum++; y--; //继续向左统计 }
//向右统计可以消灭的敌人数 while(a[x][y]!='#') { if(a[x][y]!='G') sum++; y++; //继续向右统计 }
- 接下来只需要统计在每一个空地上放置炸弹可以消灭的敌人总数。
- 最终输出消灭敌人数最多的那个空地的坐标即可。
三、代码如下
char a[20][21]; int i,j,sum,map=0,p,q,x,y,n,m; scanf("%d %d",&n,&m); //n表示有多少行字符,m表示每行有多少列 for(i=0;i<=n-1;i++) //读入n行字符 scanf("%s",a[i]); for(i=0;i<=n-1;i++) { for(j=0;j<=m-1;j++) { if(a[i][j]=='.') //判断这个点是不是平地,是平地才可以被放置炸弹 { sum=0; //用来计数,表示可以消灭的敌人数,需要初始化 x=i;y=j; //向上统计可以消灭的敌人数 while(a[x][y]!='#') //判断是不是墙,如果不是墙就继续 { if(a[x][y]=='G') //如果当前点是敌人 sum++; //计数 x--; //否则继续向上统计 } x=i;y=j; //向下统计可以消灭的敌人数 while(a[x][y]!='#') { if(a[x][y]=='G') sum++; x++; //继续向下统计 } x=i;y=j; //向左统计可以消灭的敌人数 while(a[x][y]!='#') { if(a[x][y]!='G') sum++; y--; //继续向左统计 } x=i;y=j; //向右统计可以消灭的敌人数 while(a[x][y]!='#') { if(a[x][y]!='G') sum++; y++; //继续向右统计 } /*更新map的值*/ if(sum>map) //如果当前点所能消灭的敌人总数大于map { map=sum; //则更新map p=i; //用p,q记录当前点的坐标 q=j; } } } } printf("将炸弹放置在(%d,%d),最多可以消灭%d个敌人\n",p,q,map); return 0;
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子里和园子外的大大们指正错误,共同进步。或者直接私信我 (^∀^)
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
您的资助是我最大的动力!
金额随意,欢迎来赏!
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的
本博客的所有打赏均将用于博主女朋友的化妆品购买以及养肥计划O(∩_∩)O。我是【~不会飞的章鱼~】!