美文网首页数据结构与算法
枚举(穷举)算法-炸弹人(初级版)

枚举(穷举)算法-炸弹人(初级版)

作者: 卡布萨岛 | 来源:发表于2018-10-18 15:41 被阅读0次

规则

用放置炸弹的方法来消灭敌人,,须将画面上的敌人全部消灭后并找到隐藏在墙里的暗门才能过关。


游戏图片

题目要求

现有一个特殊关卡,只有一枚炸弹,但是这枚炸弹威力超强(炸弹的爆炸方向是沿上下左右四个方向),请问放在那里可以消灭最多的敌人

分析

本实验使用枚举算法(又叫做穷举算法)

  1. 先将整个地图模型化,墙用#表示,这里有两种墙,可以被炸和不可以被炸,但是现在由于只有一枚炸弹且炸弹不能穿墙,所以都可以看成不可以被炸的。敌人用G表示,空地用 . 表示,炸弹只能放在空地上


    模型化的地图
  2. 需要用一个二维字符数组来存储这个地图,至于将炸弹放置在哪一个点可以消灭敌人最多,则需要一个个来尝试,注意,这里说的坐标(x,y)指的是x行y列
  3. 如何分别统计上下左右四个方向上可以消灭的敌人数?只要搞清一个方向,其他的方向都是一样的。向下统计为例,向下就是y不变,x每次增加1,直到遇到墙为止
while(a[x][y]!='#')
{
 if(a[x][y] == 'G')
   sun++;    //如果可以消灭一个敌人就sum++
 x++;继续向下
}
  1. 另外几个方向进行统计的坐标变化如下:


    坐标变化
  2. 统计哪个空地坐标在四个方向上消灭的敌人最多

注意:此算法没有考虑炸弹人是否能到达该空地

代码:

#include <stdio.h>

int main(void)
{
    int n = 13,m = 13;//n行m列
    char a[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#",
        "#############"
    };
    int i,j,sum,map = 0,p,q,x,y;
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < m; j++)
        {
            //首先判断这个点是否是平地,只有平地才能被防止炸弹
            if(a[i][j] == '.')
            {
                //sum用来计数(可以消灭的敌人数),需初始化为0
                sum = 0;
                
                //将当前坐标i,j复制到两个新变量x,y中,以便向上下左右四个方向分别统计可以消灭的敌人数
                
                //向上统计
                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 = sum;
                    p = i;
                    q = j;
                }
                
            }
        }
    }
    printf("Bomb set(%d,%d),Destroy the enemy at most:%d",p,q,map);
    
    getchar();
    return 0;
    
}

结果:

Bomb set(9,9),Destroy the enemy at most:8

相关文章

  • 枚举(穷举)算法-炸弹人(初级版)

    规则 用放置炸弹的方法来消灭敌人,,须将画面上的敌人全部消灭后并找到隐藏在墙里的暗门才能过关。游戏图片 题目要求 ...

  • 算法学习3_枚举

    枚举算法又称穷举算法枚举算法的核心思想 : 有序的尝试每一种可能 题一、 3 * 6528 = 3 * 8256 ...

  • 枚举(穷举)算法思想

    枚举法,也称为穷举法,是编程中常用的算法之一。在解决某些问题时,可能无法按照一定的规律从众多答案中找出正确的解。这...

  • 枚举

    枚举 枚举算法又叫穷举算法。 基本思想是“有序地去尝试每一种可能”。例子:□□□+□□□=□□□,将数字1~9分别...

  • 枚举算法

    今天我们来讲一个万金油算法,这个算法可以解决所有的问题,它就是枚举法(穷举法)。 枚举算法是我们在日常中使用到的最...

  • 穷举算法、递推算法、迭代算法(辗转法)、递归算法

    # 穷举(枚举、暴力、强力)算法 ## 基本思想 在可能的解空间中穷举出每一种可能的解,并对每一个可能解进行判断,...

  • 枚举(穷举)算法-火柴棍等式

    规则: 现有n根火柴棍,希望拼出形如A+B=C的等式,等式中的A、B、C均是由火柴棍拼出来的整数(若该数非零,则最...

  • 算法01-蛮力法

    算法01-蛮力法 一、蛮力法介绍 蛮力法(brute force method,也称为穷举法或枚举法)是一种简单直...

  • 互联网大厂常考算法及套路深度解析

    常考算法 暴力法 回溯法 分支限界法 分治法 动态规划 贪心法 暴力法 也称枚举法、穷举法、蛮力法。 基本思想: ...

  • 穷举算法

    穷举算法: 将所有可能情况的数据结果都罗列出来,然后对其进行条件判断 举例: 有红、白、黑三种球若干个,其中红、白...

网友评论

    本文标题:枚举(穷举)算法-炸弹人(初级版)

    本文链接:https://www.haomeiwen.com/subject/lyajzftx.html