poj 1915 双向 BFS 利用数组 a[x][y] = a[cp.x][cp.y] + 1; b[x][y] = b[cp.x][cp.y] + 1;保留步数

#include<iostream>
#include<queue>

using namespace std;

struct point
{
    int x, y;
};
point bufa[8] =
{
    {-2, 1}, {-1, 2}, {1, 2}, {2, 1},
    {2, -1}, {1, -2}, {-1, -2}, {-2, -1}
};

int n, a[305][305], b[305][305];

int rule(int x,int y)//判断是否符合棋盘的条件
{
    if (x >= 0 && x < n && y >= 0 && y < n)
        return 1;
    return 0;
}

int dbfs(int sx, int sy, int tx, int ty)
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            a[i][j] = b[i][j] = -1;    //  未被访问过

a[sx][sy] = b[tx][ty] = 0;

queue <point> l, r;
    point sp = { sx, sy };
    point tp = { tx, ty };
    l.push(sp);
    r.push(tp);

point cp;
    while (!(l.empty()&&r.empty()))
    {
        if (!l.empty())//正向广搜
        {
            cp = l.front();
            l.pop();
           
            for (int i = 0; i < 8; i++)
            {
                int x = cp.x + bufa[i].x;
                int y = cp.y + bufa[i].y;
                if (rule(x, y))
                {
                    if (a[x][y] == -1)               //  未被访问过 
                    {
                        a[x][y] = a[cp.x][cp.y] + 1;
                        point np = { x, y };
                        l.push(np);
                    }
                    if (b[x][y] != -1)//表明搜索过程相交
                        return a[x][y] + b[x][y];
                }
            }
        }
        if (!r.empty())//反向广搜
        {
            cp = r.front();
            r.pop();
            for (int i = 0; i < 8; i++)
            {
                int x = cp.x + bufa[i].x;
                int y = cp.y + bufa[i].y;
                if (rule(x, y))
                {
                    if (b[x][y] == -1)
                    {
                        b[x][y] = b[cp.x][cp.y] + 1;
                        point np = { x, y };
                        r.push(np);
                    }
                    if (a[x][y] != -1)//表明搜索过程相交
                        return a[x][y] + b[x][y];
                }
            }
        }
    }
}

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        cin >> n;
        int sx, sy, tx, ty;
        cin >> sx >> sy >> tx >> ty;

if (sx == tx && sy == ty)
            cout << 0 << endl;
        else
            cout << dbfs(sx, sy, tx, ty) << endl;
    }
    return 0;
}

poj 1915 双向 BFS 利用数组 a[x][y] = a[cp.x][cp.y] + 1; b[x][y] = b[cp.x][cp.y] + 1;保留步数

时间: 2024-12-24 10:34:43

poj 1915 双向 BFS 利用数组 a[x][y] = a[cp.x][cp.y] + 1; b[x][y] = b[cp.x][cp.y] + 1;保留步数的相关文章

poj 1915 KnightMoves(bfs)

Knight Moves Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 24094   Accepted: 11364 Description Background Mr Somurolov, fabulous chess-gamer indeed, asserts that no one else but him can move knights from one position to another so fast

poj 1915 BFS 利用 pre 计算步数------------------路径

// BFS #include <stdio.h> #include <string.h> int visited[301][301]; // visited 已经访问过了 int dic[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}}; int head,end,n,ex,ey,sx,sy; struct quene { int x,y,pre; // pre 前一个结点 }q[100000]; vo

poj 1915 Knight Moves (bfs搜索)

Knight Moves Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21919   Accepted: 10223 Description Background Mr Somurolov, fabulous chess-gamer indeed, asserts that no one else but him can move knights from one position to another so fast

poj 2243 bfs 利用 结构体中的step成员保存步数 ,STL的队列

//BFS #include <iostream> #include <queue> using namespace std; bool used[8][8]; int move[8][2]={1,2, -1,2, -2,1, -2,-1, -1,-2, 1,-2, 2,-1, 2,1}; struct position { int i,j; int step; position(int a,int b,int c) { i=a; j=b; step=c; } }; int mai

POJ 1915-Knight Moves (单向BFS &amp;&amp; 双向BFS 比较)

题目链接:Knight Moves 研究了一下双向BFS,不是很难,和普通的BFS一样,双向BFS不过是从 起点和终点同时开始搜索,可减少搜索时间 当两条搜索路线相遇时,结束. 貌似有一年百度的招聘 笔试,就是双向BFS.... 下面,比较一下BFS 和 双向BFS的用时: BFS STL的queue可能会浪费一点时间 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstrin

POJ 1915 Knight Moves(BFS+STL)

 Knight Moves Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 20913   Accepted: 9702 Description Background Mr Somurolov, fabulous chess-gamer indeed, asserts that no one else but him can move knights from one position to another so fa

UVa 1601 || POJ 3523 The Morning after Halloween (BFS || 双向BFS &amp;&amp; 降维 &amp;&amp; 状压)

题意 :w*h(w,h≤16)网格上有n(n≤3)个小写字母(代表鬼).要求把它们分别移动到对应的大写字母里.每步可以有多个鬼同时移动(均为往上下左右4个方向之一移动),但每步结束之后任何两个鬼不能占用同一个位置,也不能在一步之内交换位置.输入保证所有空格连通,所有障碍格也连通,且任何一个2*2子网格中至少有一个障碍格.输出最少的步数.输入保证有解. 分析 :可以将当前所有小鬼的位置作为一个状态,然后模拟小鬼移动BFS拓展出其他可行状态并且顺带记录步数,直到所有的小鬼都到达终点.首先状态如何表示

POJ 3131 Cubic Eight-Puzzle 双向BFS + HASH

超赞的一道搜索题,麻烦到没朋友,不过思路还是很清楚的. 双向搜索的时候需要注意一个地方就是起始状态只有一个,目标状态最多的时候感觉会有512个,所以要控制两个方向搜索的层数.第一次知道双向搜索还能控制层数,简直点赞. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue&

poj 1915 BFS

1 /* 2 题意:国际象棋起点到终点移动的最少步数 3 4 题解:水题,BFS就过了,有人用双向BFS 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <queue> 9 10 using namespace std; 11 12 int dir[8][2]={-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1}; 13 14 bool gra[305][305]; 15 1