数据结构与算法

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

2018-10-18  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读