zoukankan      html  css  js  c++  java
  • 迷宫问题bfs, A Knight's Journey(dfs)

    迷宫问题(bfs)

     POJ - 3984 
     
      1 #include <iostream>
      2 #include <queue>
      3 #include <stack>
      4 #include <cstring>
      5 
      6 using namespace std;
      7 
      8 /*广度优先搜索*/
      9 /*将每个未访问过的邻接点进队列,然后出队列,知道到达终点*/
     10 
     11 typedef class
     12 {
     13 public:
     14     int x;
     15     int y;
     16 }coordinate;
     17 
     18 int maze[5][5];            //迷宫
     19 int road[4][2] = { { 0, -1 }, { 1, 0 }, { -1, 0 }, { 0, 1 } };
     20 coordinate pre[20][20];            //记录当前坐标的前一个坐标
     21 
     22 int visited[5][5] = { 0 };
     23 
     24 /*利用一个栈,倒序输出pre中存入的坐标*/
     25 void print()
     26 {
     27     stack<coordinate> S;
     28     coordinate rhs = { 4, 4 };
     29 
     30     while (1)
     31     {
     32         S.push(rhs);
     33         if (rhs.x == 0 && rhs.y == 0)
     34             break;
     35         rhs = pre[rhs.x][rhs.y];
     36     }
     37 
     38     while (!S.empty())
     39     {
     40         rhs = S.top();
     41         S.pop();
     42         cout << "(" << rhs.x << ", " << rhs.y << ")" << endl;
     43     }
     44 }
     45 
     46 void bfs(int x, int y)
     47 {
     48     queue<coordinate> Q;            //用来帮助广度优先搜索
     49     coordinate position;
     50 
     51     position.x = x, position.y = y;
     52 
     53     Q.push(position);
     54 
     55     while (!Q.empty())
     56     {
     57         position = Q.front();
     58         Q.pop();
     59         
     60         visited[position.x][position.y] = 1;
     61         coordinate position2;
     62 
     63         if (position.x == 4 && position.y == 4)        //如果找到终点,停止搜索
     64         {
     65             print();
     66             return;
     67         }
     68 
     69         for (int i = 0; i < 4; i++)
     70         {
     71 
     72             position2.x = position.x + road[i][0];
     73             position2.y = position.y + road[i][1];
     74 
     75             if (position2.x >= 0 && position2.x <= 4 && position2.y >= 0 && position2.y <= 4 && maze[position2.x][position2.y] == 0 && !visited[position2.x][position2.y])        //如果这个邻接点不是墙且未访问过,则进队列
     76             {
     77                 Q.push(position2);
     78                 pre[position2.x][position2.y] = position;        //记录当前坐标的前一个坐标位置
     79                 visited[position2.x][position2.y] = 1;
     80             }
     81 
     82         }
     83     }
     84 }
     85 
     86 int main()
     87 {
     88     memset(maze, 0, sizeof(pre));
     89     for (int i = 0; i < 5; i++)
     90     for (int j = 0; j < 5; j++)
     91     {
     92         cin >> maze[i][j];
     93     }
     94 
     95     //memset(pre, 0, sizeof(pre));        //现将pre初始化
     96 
     97     bfs(0, 0);
     98 
     99 
    100     return 0;
    101 }

    A Knight's Journey

     OpenJ_Bailian - 2488 
     
     1 #include <cstring>
     2 #include<iostream>
     3 using namespace std;
     4 
     5 char route[27][2];            //记录行驶的路线
     6 int board[9][9];        //棋盘
     7 
     8 int total = 0;
     9 int length;
    10 /*dfs深度优先搜索*/
    11 
    12 int go[8][2] = { { -1, -2 }, { 1, -2 }, { -2, -1 }, { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 }, { 1, 2 } };//字典序方向
    13 
    14 /*一次跳跃*/
    15 void knight(int p, int q,int len ,int row, int col)            //len为行走的距离,用来判断是否遍历整个棋盘, row和col为当前坐标
    16 {
    17     board[row][col] = 1;                
    18     route[len][0] = col + 'A' - 1, route[len][1] =  row + '0';
    19     length = len;
    20     /*让马分别尝试8个方向的跳跃,知道跳不动为止*/
    21     
    22     int x, y;
    23 
    24     for (int i = 0; i < 8; i++)
    25     {
    26 
    27         x = row + go[i][0];
    28         y = col + go[i][1];
    29 
    30         if (x >0 && x <= p && y > 0 && y <= q && board[x][y] == 0)
    31             knight(p, q, len + 1, x, y);
    32     }
    33 
    34     /*if (row - 1 >= 1 && col - 2 > 0 && board[row - 1][col - 2] == 0)
    35         knight(p, q, len + 1, row - 1, col - 2);
    36 
    37     if (row + 1 <= p && col - 2 > 0 && board[row + 1][col - 2] == 0)
    38         knight(p, q, len + 1, row + 1, col - 2);
    39 
    40     if (row - 2 >= 1 && col - 1 > 0 && board[row - 2][col - 1] == 0)
    41         knight(p, q, len + 1, row - 2, col - 1);
    42     
    43     if (row + 2 <= p && col - 1 > 0 && board[row + 2][col - 1] == 0)
    44         knight(p, q, len + 1, row + 2, col - 1);
    45     
    46     if (row - 2 >= 1 && col + 1 <= q && board[row - 2][col + 1] == 0)
    47         knight(p, q, len + 1, row - 2, col + 1);
    48     
    49     if (row + 2 <= p && col + 1 <= q && board[row + 2][col + 1] == 0)
    50         knight(p, q, len + 1, row + 2, col + 1);
    51 
    52     if (row - 1 >= 1 && col + 2 <= q && board[row - 1][col + 2] == 0)
    53         knight(p, q, len + 1, row - 1, col + 2);
    54 
    55     if (row + 1 <= p && col + 2 <= q && board[row + 1][col + 2] == 0)
    56         knight(p, q, len + 1, row + 1, col + 2);*/
    57 
    58 }
    59 
    60 int main()
    61 {
    62     int N, p, q;        //行数, 每次的宽和高
    63     cin >> N;
    64     
    65     while (N--)
    66     {
    67         cin >> p >> q;
    68         knight(p, q, 0, 1, 1);            //以行走了0个单元
    69         cout << "Scenario #" << ++total << ":" << endl;
    70         if (length == p * q - 1)
    71         {
    72             
    73             for (int i = 0; i <= length; i++)
    74                 cout << route[i][0] << route[i][1];
    75             cout << endl << endl;
    76         }
    77         else
    78             cout << "impossible" << endl << endl;
    79         memset(board, 0, sizeof(board));        //清空棋盘的足迹
    80         memset(route, 0, sizeof(route));        //清空路线
    81     }
    82 
    83     return 0;
    84 }
  • 相关阅读:
    Raft Consensus Algorithm 分布式系统一致性协议
    Dynamic Programming 类问题的空间优化方法
    Bellman–Ford and SPFA Algorithm
    K8S
    SegmentTree
    TCP TIME_WAIT 状态
    When does locking or MVCC occur? Where do I need to specify which one the database should use?
    神经网络的工作原理
    React Native:State 及其 生命周期
    Css Animation
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/10440007.html
Copyright © 2011-2022 走看看