搜c语言题,广度优先搜索例题(C语言)

**代码和测试数据都有,可以直接拷贝运行~**

题目:

1997ae6f4b8c6b57160fc343ea8fb03b.png

代码:

#include

//全局变量

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 (headn-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;

}

测试数据:

d69d2ee977a4040a696697a8f5937e01.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值