zoukankan      html  css  js  c++  java
  • hdu 1372 AND poj 2243 bfs和双向bfs两种解法

    骑士巡游找最短路。

    单向bfs:

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 using namespace std;
     5 
     6 const int N = 8;
     7 const int M = N * N;
     8 int step[N][N];
     9 int dir[N][2] = { 1, 2, 1, -2, -1, 2, -1, -2, 2, 1, 2, -1, -2, 1, -2, -1 };
    10 
    11 struct Node
    12 {
    13     int x, y;
    14 
    15     Node () {}
    16 
    17     Node ( int _x, int _y )
    18     {
    19         x = _x, y = _y;
    20     }
    21 
    22 } q[M];
    23 
    24 bool ok( int x, int y )
    25 {
    26     return x >= 0 && x < N && y >= 0 && y < N && step[x][y] == -1;
    27 }
    28 
    29 int bfs( char src[], char des[] )
    30 {
    31     int sx = src[0] - 'a', sy = src[1] - '1';
    32     int ex = des[0] - 'a', ey = des[1] - '1';
    33     memset( step, -1, sizeof(step) );
    34     int head = 0, tail = 0;
    35     q[tail++] = Node( sx, sy );
    36     step[sx][sy] = 0;
    37     while ( head < tail )
    38     {
    39         Node t = q[head++];
    40         if ( t.x == ex && t.y == ey ) return step[t.x][t.y];
    41         for ( int i = 0; i < N; i++ )
    42         {
    43             int xx = t.x + dir[i][0];
    44             int yy = t.y + dir[i][1];
    45             if ( ok( xx, yy ) )
    46             {
    47                 q[tail++] = Node( xx, yy );
    48                 step[xx][yy] = step[t.x][t.y] + 1;
    49             }
    50         }
    51     }
    52     return -1;
    53 }
    54 
    55 int main()
    56 {
    57     char s[3], t[3];
    58     while ( scanf("%s%s", s, t) != EOF )
    59     {
    60         printf("To get from %s to %s takes %d knight moves.
    ", s, t, bfs( s, t ));
    61     }
    62     return 0;
    63 }

    双向bfs:

      1 #include <iostream>
      2 #include <cstring>
      3 #include <cstdio>
      4 #include <queue>
      5 using namespace std;
      6 
      7 const int INF = 9999999;
      8 const int N = 8;
      9 const int M = N * N;
     10 int step[N][N];
     11 int visit[N][N];
     12 int dir[N][2] = { 1, 2, 1, -2, -1, 2, -1, -2, 2, 1, 2, -1, -2, 1, -2, -1 };
     13 
     14 struct Node
     15 {
     16     int x, y;
     17 
     18     Node () {}
     19 
     20     Node ( int _x, int _y )
     21     {
     22         x = _x, y = _y;
     23     }
     24 
     25 };
     26 
     27 bool ok( int x, int y )
     28 {
     29     return x >= 0 && x < N && y >= 0 && y < N;
     30 }
     31 
     32 queue<Node> q1, q2;
     33 
     34 int bfs( char src[], char des[] )
     35 {
     36     int sx = src[0] - 'a', sy = src[1] - '1';
     37     int ex = des[0] - 'a', ey = des[1] - '1';
     38     if ( sx == ex && sy == ey ) return 0;
     39     while ( !q1.empty() ) q1.pop();
     40     while ( !q2.empty() ) q2.pop();
     41     memset( visit, 0, sizeof(visit) );
     42     q1.push( Node( sx, sy ) );
     43     visit[sx][sy] = 1;
     44     step[sx][sy] = 0;
     45     q2.push( Node( ex, ey ) );
     46     visit[ex][ey] = 2;
     47     step[ex][ey] = 0;
     48     int ans = INF, sp = 0;
     49     while ( !q1.empty() && !q2.empty() )
     50     {
     51         while ( !q1.empty() && step[q1.front().x][q1.front().y] == sp )
     52         {
     53             Node tmp = q1.front(); q1.pop();
     54             for ( int i = 0; i < N; i++ )
     55             {
     56                 int xx = tmp.x + dir[i][0], yy = tmp.y + dir[i][1];
     57                 if ( ok( xx, yy ) )
     58                 {
     59                     if ( visit[xx][yy] == 1 ) continue;
     60                     if ( visit[xx][yy] == 2 ) 
     61                     {
     62                         ans = min( ans, step[tmp.x][tmp.y] + step[xx][yy] + 1 );
     63                         continue;
     64                     }
     65                     q1.push( Node( xx, yy ) );
     66                     step[xx][yy] = step[tmp.x][tmp.y] + 1;
     67                     visit[xx][yy] = 1;
     68                 }
     69             }
     70         }
     71         while ( !q2.empty() && step[q2.front().x][q2.front().y] == sp )
     72         {
     73             Node tmp = q2.front(); q2.pop();
     74             for ( int i = 0; i < N; i++ )
     75             {
     76                 int xx = tmp.x + dir[i][0], yy = tmp.y + dir[i][1];
     77                 if ( ok( xx, yy ) )
     78                 {
     79                     if ( visit[xx][yy] == 2 ) continue;
     80                     if ( visit[xx][yy] == 1 ) 
     81                     {
     82                         ans = min( ans, step[tmp.x][tmp.y] + step[xx][yy] + 1 );
     83                         continue;
     84                     }
     85                     q2.push( Node( xx, yy ) );
     86                     step[xx][yy] = step[tmp.x][tmp.y] + 1;
     87                     visit[xx][yy] = 2;
     88                 }
     89             }
     90         }
     91         sp++;
     92         if ( ans != INF ) return ans;
     93     }
     94     return -1;
     95 }
     96 
     97 int main()
     98 {
     99     char s[3], t[3];
    100     while ( scanf("%s%s", s, t) != EOF )
    101     {
    102         printf("To get from %s to %s takes %d knight moves.
    ", s, t, bfs( s, t ));
    103     }
    104     return 0;
    105 }
  • 相关阅读:
    phpQuery—基于jQuery的PHP实现
    php 知乎爬虫
    windows下安装php5.5的redis扩展
    Redis 安装
    使用AngularJS创建应用的5个框架
    Redis能干啥?细看11种Web应用场景
    前端开发必须知道的JS之闭包及应用
    javascript深入理解js闭包
    day16<集合框架+>
    day15<集合框架>
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4439259.html
Copyright © 2011-2022 走看看