鸣人与佐助 bfs

原网址
广度搜索 比较麻烦的地方是加了一个查克拉,用book数组标记的时候将查克拉加上就ok 记得当时做的时候废了好长时间
两种方法,不多bb
AC代码
三维数组标记的

#include
#include
struct node
{
    int x,y,step,num;
}q[40002];
int m,n,ck,sx,sy;
char map[202][202];
int book[202][202][20];
void bfs()
{
    memset(book,0,sizeof(book));
    int tx,ty,tz,head,tail;
    int dir[4][2]={0,1,0,-1,1,0,-1,0};
    head=tail=1;
    q[1].x=sx,q[1].y=sy,q[1].num=ck;q[1].step=0;
    book[sx][sy][ck]=1;
    tail++;
    while(head<tail)
    {
        for(int i=0; i<4; i++)
        {
            int tx=q[head].x+dir[i][0];
            int ty=q[head].y+dir[i][1];
            int tz=q[head].num;
            if(book[tx][ty][tz])
                continue;
            if(tx<0||tx>=n||ty<0||ty>=m)
                continue;
            if(map[tx][ty]=='*')
            {
                book[tx][ty][tz]=1;
                q[tail].x=tx,q[tail].y=ty,q[tail].step=q[head].step+1,q[tail++].num=tz;
            }
            if(map[tx][ty]=='#'&&tz>0)
            {
                book[tx][ty][tz]=1;
                q[tail].x=tx,q[tail].y=ty,q[tail].step=q[head].step+1,q[tail++].num=tz-1;
            }
            if(map[tx][ty]=='+')
            {
                printf("%d\n",q[head].step+1);
                return;
            }
        }
        head++;
    }
    printf("-1\n");
}
int main()
{
    int flag=0;
    scanf("%d%d%d",&n,&m,&ck);
    for(int i=0;i<n;i++)
        scanf("%s",map[i]);
    for(int i=0;i<n;i++)
    {

       for(int j=0;j<m;j++)
        {
            if(map[i][j]=='@')
            {
                sx=i;
                sy=j;
                flag=1;
                break;
            }
        }
        if(flag) break;
    }
    bfs();
	return 0;
}

直接判断的

#include
#include
struct node
{
    int x,y,num,time;
}q[40002];
int book[202][202];
char map[202][202];
int sx,sy,t,n,m;
int bfs()
{
    memset(book,-1,sizeof(book));
    book[sx][sy]=t;
    int tail,head,tx,ty,tz;
    int dir[4][2]={0,1,0,-1,1,0,-1,0};
    q[1].x=sx,q[1].y=sy,q[1].time=0,q[1].num=t;
    head=tail=1;
    tail++;
    while(head<tail)
    {
        for(int i=0;i<4;i++)
        {
            tx=q[head].x+dir[i][0];
            ty=q[head].y+dir[i][1];
            tz=q[head].num;
            if(tx<0||ty<0||tx>=n||ty>=m)
                continue;
            if(map[tx][ty]=='#'&&tz==0)
                continue;
            if(map[tx][ty]=='*'||map[tx][ty]=='+'||map[tx][ty]=='#')
            {
                if(map[tx][ty]=='#')
                    q[tail].num=tz-1;
                else  q[tail].num=tz;
                if(q[tail].num>book[tx][ty])
                {
                    book[tx][ty]=q[tail].num;
                    q[tail].x=tx;
                    q[tail].y=ty;
                    q[tail++].time=q[head].time+1;
                }
                if(map[tx][ty]=='+')
                    return q[tail-1].time;
            }
        }
        head++;
    }
    return 0;
}
int main()
{
    int i,j,key;
    scanf("%d%d%d",&n,&m,&t);
    for(i=0;i<n;i++)
        scanf("%s",map[i]);
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
    {
        if(map[i][j]=='@')
        {
            sx=i,sy=j;
            break;
        }
    }
    key=bfs();
    if(key)  printf("%d\n",key);
    else  printf("-1\n");

}

你可能感兴趣的:(搜索)