炸弹人 广度优先—C

来源:互联网 发布:inside剧情解析 知乎 编辑:程序博客网 时间:2024/05/16 05:06

二维地图,找出哪一点可以炸最多的敌人,使用广度优先遍历每个可达点,计算每个点可以炸的敌人数,找出最多的那个点.

#include<stdio.h>char a[20][20];//存地图struct node{    int x;    int y;};int getnum(int x,int y){    int sum=0 ,i,j;    i=x;    j=y;    while(a[i][j]!='#')    {        if(a[i][j]=='G')            sum++;        j++;    }    i=x;    j=y;    while(a[i][j]!='#')    {        if(a[i][j]=='G')            sum++;        i++;    }    i=x;    j=y;    while(a[i][j]!='#')    {        if(a[i][j]=='G')            sum++;        j--;    }     i=x;    j=y;    while(a[i][j]!='#')    {        if(a[i][j]=='G')            sum++;        i--;    }    return sum;}int main(){    int i,j,k,startx,starty,tx,ty;    int n,m,max,sum,mx,my;    int book[20][20]={0};    struct node queue[400],t;    int head,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;i<=n-1;i++)        scanf("%s",a[i]);//读入n行字符    head=1;    tail=1;    queue[tail].x=startx;    queue[tail].y=starty;    tail++;    book[startx][starty]=1;    max=getnum(startx,starty);    while(head<tail)    {        t=queue[head];        for(k=0;k<=3;k++)        {           tx=t.x+next[k][0];           ty=t.y+next[k][1];           if(tx<0||tx>n-1||ty<0||ty>m-1)               continue;           if(a[tx][ty]=='.'&&book[tx][ty]==0)           {               book[tx][ty]=1;               queue[tail].x=tx;               queue[tail].y=ty;               tail++;               sum=getnum(tx,ty);               if(sum>max)                {                    max=sum;                    mx=tx;                    my=ty;                }           }        }        head++;    }    printf("炸弹放在(%d,%d)处,炸的敌人最多为%d",mx,my,sum);    return 0;}
原创粉丝点击