炸弹人
有一个特殊的关卡。只有一枚炸弹,但是这枚炸弹威力超强(杀伤距离超长,可以消灭杀伤范围内所有敌人)。请问在哪里放置炸弹才可以消灭最多的敌人
//用一个二维字符数组来存储地图,将每个点进行枚举,需要沿着上下左右四个方向分别统计可以消灭敌人的数目
//从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之间枚举就可以了