问题及代码:
/*
炸弹人:计算出哪个位置的炸弹能炸到最多的人(本题有例外情况,需要优化)
*/
#include
int main()
{
char a[20][21];
int i,j,sum,map=0,p,q,m,n,x,y;
scanf("%d %d",&n,&m);//n表示行字符数
for(i=0;i<=n-1;i++)
scanf("%s",&a[i]); //读入n行字符
for(i=0;i<=n-1;i++)
{
for(j=0;j<=m-1;i++)
{
if(a[i][j]=='.') //判断可放置炸弹的位置
{
sum=0;
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++; //右移
}
if(sum>map) //更新map的值
{
map=sum;
//p、q标记当前点坐标
p=i;
q=j;
}
}
}
}
printf("放置的位置[%d,%d],消灭的敌人数量%d",p,q,sum);
getchar();getchar();
return 0;
}
对sum>map不是很理解,map具体指什么?
/*炸弹人新解:深度优化算法更完美*/
#include
struct note //给队列用,队列的元素为图的每一个坐标,包含x和y
{
int x;
int y;
};
char a[20][21];
int getnum(int i,int j)//当前i、j坐标消灭的敌人数
{
int sum,x,y;
sum=0; //计数
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') //“G”表示敌人
sum++;
y--;
}
x=i;y=j;
while(a[x][y]!='#')
{
if(a[x][y]=='G')
sum++;
y++;
}
return sum;
}
int main()
{
struct note q[401];
int book[20][20]={0};
int i,j,n,m,k,sum,startx,starty,tx,ty,mx,my,max=0;
int head;
int tail;
//点向四个方向走
int next[4][2]={{0,1},
{1,0},
{0,-1},
{-1,0}};
scanf("%d %d %d %d",&n,&m,&startx,&starty); //读入行列数及初始坐标
for(i=0;in||ty<0||ty>n) //判断边界
continue;
if(a[tx][ty]=='.' && book[tx][ty]==0) //“.”表示可以放置炸弹
{
book[mx][my]==1;
q[tail].x=tx;//入栈
q[tail].y=ty;
tail++;
sum=getnum(tx,ty);
if(sum>max)
{
max=sum;
mx=tx;
my=ty;
}
}
}
head++;
}
printf("将炸弹放置在(%d,%d)处,可以消灭%d个敌人",mx,my,max);
getchar();getchar();
return 0;
}