• 双向BFS


     1 /*
     2 转自http://blog.csdn.net/custqi/article/details/6455425
     3 感觉对双向广搜写得挺清楚的
     4 */
     5 #include<iostream>
     6 #include<cmath>
     7 #include<queue>
     8 using namespace std;
     9 const int maxn = 301;
    10 int n;
    11 int used[maxn][maxn];
    12 int g[maxn][maxn];
    13 int d[8][2] = { { -2, -1 }, { -2, 1 }, { -1, -2 }, { -1, 2 }, { 1, -2 }, { 1, 2 }, { 2, -1 }, { 2, 1 } };
    14 
    15 struct Point
    16 {
    17     int x, y;
    18 }st, ed;
    19 int Check(int x, int y)
    20 {
    21     return (x >= 0 && x<n && y >= 0 && y<n);
    22 }
    23 int solve()
    24 {
    25     int sx, sy, tx, ty; //sx,sy 先前结点 tx,ty生成新结点
    26     queue<Point>Q;
    27     Point curNode, nextNode;
    28     memset(used, 0, sizeof(used));
    29     //放入起始结点
    30     g[st.x][st.y] = 0;
    31     used[st.x][st.y] = 1;//由起始结点方向扩展的结点记录值为 1    
    32     Q.push(st);
    33     //放入终止结点
    34     g[ed.x][ed.y] = 0;
    35     used[ed.x][ed.y] = 2;//由终止结点方向扩展的结点记录值为 2    
    36     Q.push(ed);
    37     //同时放入起始结点和终止结点 进行双向广搜
    38     while (!Q.empty())
    39     {
    40         curNode = Q.front();
    41         Q.pop();
    42         sx = curNode.x;
    43         sy = curNode.y;
    44         for (int i = 0; i<8; i++)
    45         {
    46             tx = sx + d[i][0];
    47             ty = sy + d[i][1];
    48             if (!Check(tx, ty)) continue;
    49             if (used[tx][ty] == 0)    //如果used[tx][ty]未访问过            
    50             {
    51                 g[tx][ty] = g[sx][sy] + 1; //更新在tx ty的值                
    52                 nextNode.x = tx;
    53                 nextNode.y = ty;
    54                 used[tx][ty] = used[sx][sy]; //                 
    55                 Q.push(nextNode);
    56             }
    57             else if (used[sx][sy] != used[tx][ty])    //起始方向与终止方向同时进行后,此时的结点为俩个方向相遇的点,得到结果        
    58             {
    59                 return g[sx][sy] + g[tx][ty] + 1;
    60             }
    61         }
    62     }
    63     return 0;
    64 }
    65 int main()
    66 {
    67     int TestCases;
    68     scanf("%d", &TestCases);
    69     while (TestCases--)
    70     {
    71         scanf("%d%d%d%d%d", &n, &st.x, &st.y, &ed.x, &ed.y);
    72         printf("%d/n", solve());
    73     }
    74     return 0;
    75 }
  • 相关阅读:
    java+selenium 3.x的火狐自动化测试环境
    Jmeter+badboy环境搭建
    Linux环境下搭建Tomcat+mysql+jdk环境
    线程池的配置说明
    关于事务的使用规范
    生产事故 java.lang.OutOfMemoryError: GC overhead limit exceeded
    linux检查网络运行情况命令
    百万数据迁移的线程分组
    XML报文拼接 乱码
    创建数据源、连接数据库
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4293417.html
Copyright © 2020-2023  润新知