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

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

作者: 卡布萨岛 | 来源:发表于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
    

    相关文章

      网友评论

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

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