第3章第2节-炸弹人-枚举

/*#表示墙、G表示敌人、.表示空地
问炸弹放在那个位置才可以消灭最多的敌人
示例输入:
    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#
    #############
示例输出:
    将炸弹放置在(9,9)处,最多可消灭8个敌人
*/ 
#include "stdio.h"
int main()
{
    char a[20][21];//假设这里的地图大小不超过20*20
    int i,j,sum,map = 0,p,q,x,y,n,m;
    //读入n和m,n表示有多少行字符,m表示每行有多少列
    scanf("%d %d",&n,&m);
    //读入n行字符
    for(i = 0; i <= n - 1; i++)
        scanf("%s",a[i]);
    //用两重循环枚举地图中的每一个点
    for(i = 0; i <= n - 1; i++)
    {
        for(j = 0; j <= m - 1; 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--;
                }
                //向下统计可以消灭的敌人数
                x = i;
                y = j;
                while(a[x][y] != '#')
                {
                    if(a[x][y] == 'G')
                        sum++;
                    //x++的作用是继续向下统计
                    x++;
                }
                //向左统计可以消灭的敌人数
                x = i; 
                y = j;
                while(a[x][y] != '#')
                {
                    if(a[x][y] == 'G')
                        sum++;
                    //y--的作用是继续向左统计
                    y--;
                }

                //向右统计可以消灭的敌人数
                x = i; 
                y = j;
                while(a[x][y] != '#')
                {
                    if(a[x][y] == 'G')
                        sum++;
                    //y++的作用是继续向右统计
                    y++;
                }
                //更新map的值
                if(sum > map)
                {
                    //如果当前点所能消灭的敌人总数大于map,则更新map
                    map = sum;
                    //并用p和q当前点的坐标
                    p = i;
                    q = j;
                }
            }
        }
    }    
    printf("将炸弹放置在(%d,%d),最多可以消灭%d个敌人\n",p,q,map);
    getchar();getchar();
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/perfect_zdq/article/details/89285613