**代碼和測試數據都有,可以直接拷貝運行~**
題目:
代碼:
#include <stdio.h>
//全局變量
char a[20][21];
struct node
{
int x;
int y;
};
int getnum(int i,int j)
{
int x,y,sum;
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++;
}
return sum;
}
int main()
{
struct node que[401];//假設地圖大小不超過20*20
int head,tail;
int book[20][21]={0};//定義一個標記數組,1表示該位置已經計算過,0表示還未計算
int n,m,tx,ty,i,j,k,startx,starty;
int sum,max=0,mx,my;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
// n行,m列;初始位置爲startx,starty
scanf("%d %d %d %d",&n,&m,&startx,&starty);
for (i=0;i<=n-1;i++)
{
scanf("%s",a[i]);//一次讀入一行
}
//隊列初始化
head=1;tail=1;
que[tail].x=startx;
que[tail].y=starty;
tail++;
book[startx][starty]=1;
max=getnum(startx,starty);
mx=startx;
my=starty;
while (head<tail)
{
for (k=0;k<=3;k++)
{
//下一個點位
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
//判斷是否超出邊界
if (tx<0 || tx>n-1 || ty<0 || tx>m-1)
{
continue;
}
//判斷是否爲平地或者已經走過
if (a[tx][ty]=='.' && book[tx][ty]==0)
{
book[tx][ty]=1;
//將新的點位加入到隊列中
que[tail].x=tx;
que[tail].y=ty;
tail++;
//統計新的點位可消滅的敵人總數
sum=getnum(tx,ty);
if (sum>max)
{
max=sum;
mx=tx;
my=ty;
}
}
}
head++;//要想得到下一個新的點位,就必須要head++
}
printf("將炸彈放置在(%d,%d)處,最多可以消滅%d個敵人\n",mx,my,max);
return 0;
}
測試數據: