NYoj 58 最少步数

广搜,尽量自己写队列!StL除了节省写代码的时间,其他的不见得节省多少!

题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=58

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
const int INF = 100000;

int Graph[9][9] = {
    {1,1,1,1,1,1,1,1,1},
    {1,0,0,1,0,0,1,0,1},
    {1,0,0,1,1,0,0,0,1},
    {1,0,1,0,1,1,0,1,1},
    {1,0,0,0,0,1,0,0,1},
    {1,1,0,1,0,1,0,0,1},
    {1,1,0,1,0,1,0,0,1},
    {1,1,0,1,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1}
};

struct Point_State
{
    int x;
    int y;
    int time;
    Point_State()
    {
        x = 0;
        y = 0;
        time = INF;
    }
};

int dir[4][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
Point_State Targetpos;
bool visit[9][9];

bool Is_CanGo(int x, int y)
{
    if(x < 0 || x >= 9 || y < 0 || y >= 9 || Graph[x][y] == 1 || visit[x][y])
        return false;
    return true;
}

int BFS(Point_State CurState)
{
    Point_State Que[100];
    int qe, qs;
    qe = qs = 0;
    Que[qe++] = CurState;

    while(qs < qe)
    {
        Point_State temp = Que[qs++];
        if(temp.x == Targetpos.x && temp.y == Targetpos.y)
            return temp.time;

        visit[temp.x][temp.y] = 1;

        for(int i = 0; i < 4; ++i)
        {
            Point_State t;
            t.x = temp.x + dir[i][0];
            t.y = temp.y + dir[i][1];

            if(Is_CanGo(t.x, t.y) && t.time > temp.time + 1)
            {
                t.time = temp.time + 1;
                Que[qe++] = t;
            }
        }
    }
}

/**
用StL
//并不节省内存!
int BFS(Point_State Curpos)
{
    queue <Point_State> Que;
    while(!Que.empty())
        Que.pop();
    Que.push( Curpos );
    while(!Que.empty())
    {
        Point_State temp = Que.front();
        Que.pop();
        if(temp.x == Targetpos.x && temp.y == Targetpos.y)
            return temp.time;
        visit[temp.x][temp.y] = 1;
        for(int i = 0; i < 4; ++i)
        {
            Point_State t;
            t.x = temp.x + dir[i][0];
            t.y = temp.y + dir[i][1];
            if(Is_CanGo(t.x, t.y) && t.time > temp.time + 1)
            {
                t.time = temp.time + 1;
                Que.push(t);
            }
        }
    }
    return 0;
}
*/
int main()
{
    int T;
    scanf("%d", &T);
    Point_State StartPos;
    while(T--)
    {
        scanf("%d %d %d %d", &StartPos.x, &StartPos.y, &Targetpos.x, &Targetpos.y);
        memset(visit, 0, sizeof(visit));
        StartPos.time = 0;
        printf("%d\n", BFS(StartPos));
    }
    return 0;
}


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