【无标题】

炸弹人

有一个特殊的关卡。只有一枚炸弹,但是这枚炸弹威力超强(杀伤距离超长,可以消灭杀伤范围内所有敌人)。请问在哪里放置炸弹才可以消灭最多的敌人

//用一个二维字符数组来存储地图,将每个点进行枚举,需要沿着上下左右四个方向分别统计可以消灭敌人的数目
//从0行0列开始计算、
//#表示墙,G表示敌人,.表示空地
#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=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
                    map=sum;
                    //并用p和q记录当前点的坐标
                    p=i;
                    q=j;
                }
            }
        }
    }
    printf("将炸弹放置在(%d,%d),最多能消灭%d个敌人",p,q,map);
    return 0;
}

首先需要用一个二维字符数组来存储这个地图,至于将炸弹放置在哪一个点可以消灭的敌人最多,则需要一个个地来尝试。炸弹的爆炸方向是沿上下左右四个方向,因此我们在对每个点进行枚举的时候,需要沿着上下左右四个方向分别统计可以消灭敌人的数目。

火柴棍等式

小哼有n根火柴棍,希望拼出形如A+B=C的等式。等式中的A、B、C均是用火柴棍拼出来的整数。现在小哼手上有m根火柴棍,那么小哼可以拼出多少个不同的形如A+B=C的等式?

注意:

1.加号与等号各自需要两根火柴棍

2.如果A!=B,则A+B=C与B+A=C视为不同的等式

3.所有火柴棍必须全部用上

 

//小哼手里有m根火柴棍,那么可以拼出多少个不同的形如A+B=C的等式
//加号与等号各需要两根火柴棍
//如果A!=B,则A+B=C与B+A=C视为不同的等式
#include<stdio.h>
int main()
{
    int fun(int x);
    int a,b,c,m,sum=0;//sum用来计数
    scanf("%d",&m);//火柴棍的个数
    //开始枚举a和b
    for(a=0;a<=1111;a++){
        for(b=0;b<=1111;b++){
            c=a+b;
            if(fun(a)+fun(b)+fun(c)==m-4)
            {
                printf("%d+%d=%d\n",a,b,c);
                sum++;
            }
        }
    }
    printf("一共可以拼出%d个不同的等式",sum);
    return 0;
}
int fun(int x)
{
    int num=0;//用来计数
    int f[10]={6,2,5,5,4,5,6,3,7,6};//每个数字需要的火柴数
    while(x/10!=0)//商不为0,代表x至少是两位数
    {
        //获得x的末尾数字并将此数所需要用到的火柴棍根数累加到num中
        num+=f[x%10];
        x=x/10;//去掉x的末尾数字
    }
    //最后再加上此时x所需用到的火柴棍的根数(此时x一定是一位数)
    num+=f[x];
    return num;
}

既然要找出形如A+B=C这样的等式,则最简单的办法就是分别枚举A、B、C。我们只需要在0~1111之间枚举就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值