这题目怎么做。。

P1649 [USACO07OCT] Obstacle Course S

Blackie @ 2016-10-16 17:04:12

想到用宽搜,但答案错掉了。。

每一个点都记录一个方向与转的次数,向四个方向宽搜,如果方向不对头就把turn+1,最后到达的时候输出turn。

全部搜一遍没搜到就-1.

但是、但是为什么就30分。。【委屈脸】写了我40分钟啊。。

代码贴一下(暴丑无比不过还是希望大神能看看。。)

#include<iostream>
using namespace std;

const int UP=1,DOWN=2,LEFT=3,RIGHT=4;

int n,head=1,tail=1,destinationx,destinationy;
struct node
{
    char here;
    int turn;
    int x;
    int y;
    int direction;
}map[101][101],que[1001];

void push(node a)
{
    que[tail]=a;
    tail++;

    return;
}

node pop()
{
    head++;

    return que[head-1];
}

bool empty()
{
    if(head==tail)
        return true;

    return false;
}

void bfs()
{
    node top;

    while(empty()==false)
    {
        top=pop();
        map[top.x][top.y]=top;

        if(top.x==destinationx && top.y==destinationy)
        {
            cout<<top.turn<<endl;
            return;
        }

        if(top.direction==0)
        {
            if(map[top.x-1][top.y].here=='.' && map[top.x-1][top.y].turn==-1 && top.x-1>=1)
            {
                map[top.x-1][top.y].direction=UP;
                map[top.x-1][top.y].turn=0;
                push(map[top.x-1][top.y]);
            }
            if(map[top.x+1][top.y].here=='.' && map[top.x+1][top.y].turn==-1 && top.x+1<=n)
            {
                map[top.x+1][top.y].direction=DOWN;
                map[top.x+1][top.y].turn=0;
                push(map[top.x+1][top.y]);
            }
            if(map[top.x][top.y-1].here=='.' && map[top.x][top.y-1].turn==-1 && top.y-1>=1)
            {
                map[top.x][top.y-1].direction=LEFT;
                map[top.x][top.y-1].turn=0;
                push(map[top.x][top.y-1]);
            }
            if(map[top.x][top.y+1].here=='.' && map[top.x][top.y+1].turn==-1 && top.y+1<=n)
            {
                map[top.x][top.y+1].direction=RIGHT;
                map[top.x][top.y+1].turn=0;
                push(map[top.x][top.y+1]);
            }

            continue;
        }//起始状况

        if(map[top.x-1][top.y].here=='.' && map[top.x-1][top.y].turn==-1 && top.x-1>=1)
        {
            map[top.x-1][top.y].direction=UP;

            if(top.direction!=UP)
                map[top.x-1][top.y].turn=top.turn+1;
            else
                map[top.x-1][top.y].turn=top.turn;

            push(map[top.x-1][top.y]);
        }
        if(map[top.x+1][top.y].here=='.' && map[top.x+1][top.y].turn==-1 && top.x+1<=n)
        {
            map[top.x+1][top.y].direction=DOWN;

            if(top.direction!=DOWN)
                map[top.x+1][top.y].turn=top.turn+1;
            else
                map[top.x+1][top.y].turn=top.turn;

            push(map[top.x+1][top.y]);
        }
        if(map[top.x][top.y-1].here=='.' && map[top.x][top.y-1].turn==-1 && top.y-1>=1)
        {
            map[top.x][top.y-1].direction=LEFT;

            if(top.direction!=LEFT)
                map[top.x][top.y-1].turn=top.turn+1;
            else
                map[top.x][top.y-1].turn=top.turn;

            push(map[top.x][top.y-1]);
        }
        if(map[top.x][top.y+1].here=='.' && map[top.x][top.y+1].turn==-1 && top.y+1<=n)
        {
            map[top.x][top.y+1].direction=RIGHT;

            if(top.direction!=RIGHT)
                map[top.x][top.y+1].turn=top.turn+1;
            else
                map[top.x][top.y+1].turn=top.turn;

            push(map[top.x][top.y+1]);
        }//向四个方向搞 
    }//while !empty();

    cout<<-1<<endl;

    return;
}

void read()
{
    int i,j;

    cin>>n;
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
        {
            cin>>map[i][j].here;

            map[i][j].x=i;
            map[i][j].y=j;
            map[i][j].turn=-1;
            map[i][j].direction=-1;

            if(map[i][j].here=='A')
            {
                map[i][j].direction=0;
                push(map[i][j]);
            }

            if(map[i][j].here=='B')
            { 
                destinationx=i;
                destinationy=j;
                map[i][j].here='.';
            } 
        }

    bfs();

    return;
}

int main()
{
    read();
    return 0;
}

by 浮尘ii @ 2016-10-16 20:46:40

@Blackie

请注意BFS的原理,广度优先搜索是把同层的结点扩展到再扩展下一层。

这题如果使用BFS需要一次性把转弯turn次的状态全部扩展到。

并不能保证最短的路程转弯数也最少。


by Blackie @ 2016-10-16 22:52:30

藕!!我懂了!!

感谢感谢!!

非常谢谢!

@qq2477259579


|