炸弹人 广度优先—C

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

#include
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(headfor(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;
}

你可能感兴趣的:(算法)