• BFS+模拟 ZOJ 3865 Superbot


    题目传送门

      1 /*
      2     BFS+模拟:dp[i][j][p] 表示走到i,j,方向为p的步数为多少;
      3             BFS分4种情况入队,最后在终点4个方向寻找最小值:)
      4 */
      5 #include <cstdio>
      6 #include <iostream>
      7 #include <algorithm>
      8 #include <cstring>
      9 #include <string>
     10 #include <queue>
     11 using namespace std;
     12 
     13 const int MAXN = 1e2 + 10;
     14 const int INF = 0x3f3f3f3f;
     15 int dir[4][4][2] = {
     16 {{0, -1}, {0, 1}, {-1, 0}, {1, 0}},
     17 {{1, 0}, {0, -1}, {0, 1}, {-1, 0}},
     18 {{-1, 0}, {1, 0}, {0, -1}, {0, 1}},
     19 {{0, 1}, {-1, 0}, {1, 0}, {0, -1}}
     20 };
     21 int dp[12][12][4];
     22 int dp2[12][12][4];
     23 int ans[12][12][4];
     24 char maze[12][12];
     25 int sx, sy, ex, ey;
     26 int n, m, P;
     27 
     28 bool ok(int nx, int ny, int np)
     29 {
     30     if (nx < 0 || nx >= n || ny < 0 || ny >= m)   return false;
     31     if (maze[nx][ny] == '*' || dp[nx][ny][np] != -1)   return false;
     32 
     33     return true;
     34 }
     35 
     36 void BFS(void)
     37 {
     38     int x, y, nx, ny, p, np;
     39     queue<int> q;
     40     q.push (sx);    q.push (sy);    q.push (0);
     41 
     42     while (!q.empty ())
     43     {
     44         x = q.front (); q.pop ();
     45         y = q.front (); q.pop ();
     46         p = q.front (); q.pop ();
     47 
     48         if (x == ex && y == ey && ans[x][y][p] == -1)
     49             ans[x][y][p] = dp[x][y][p];
     50 
     51         nx = x + dir[dp[x][y][p]/P%4][p][0];
     52         ny = y + dir[dp[x][y][p]/P%4][p][1];
     53         if (ok (nx, ny, p))     //move robot, not move dir
     54         {
     55             dp[nx][ny][p] = dp[x][y][p] + 1;
     56             q.push (nx);    q.push (ny);    q.push (p);
     57         }
     58 
     59         np = p + 1;
     60         if (np > 3)    np = 0;
     61         if (ok (x, y, np))        //not move robot, move dir to right
     62         {
     63             dp[x][y][np] = dp[x][y][p] + 1;
     64             q.push (x);    q.push (y);    q.push (np);
     65         }
     66 
     67         np = p - 1;
     68         if (np < 0) np = 3;
     69         if (ok (x, y, np))        //not move robot, move dir to left
     70         {
     71             dp[x][y][np] = dp[x][y][p] + 1;
     72             q.push (x);    q.push (y);    q.push (np);
     73         }
     74 
     75         if (dp[x][y][p] <= 200)        //not move
     76         {
     77             dp[x][y][p]++;
     78             q.push (x); q.push (y); q.push (p);
     79         }
     80     }
     81 
     82     return ;
     83 }
     84 
     85 int main(void)        //ZOJ 3865 Superbot
     86 {
     87     //freopen ("F.in", "r", stdin);
     88 
     89     int t;
     90     scanf ("%d", &t);
     91     while (t--)
     92     {
     93         memset (dp, -1, sizeof (dp));
     94         memset (ans, -1, sizeof (ans));
     95 
     96         scanf ("%d%d%d", &n, &m, &P);
     97 
     98         for (int i=0; i<n; ++i) scanf ("%s", &maze[i]);
     99         for (int i=0; i<n; ++i)
    100         {
    101             for (int j=0; j<m; ++j)
    102             {
    103                 if (maze[i][j] == '@')  sx = i, sy = j;
    104                 else if (maze[i][j] == '$') ex = i, ey = j;
    105             }
    106         }
    107 
    108         dp[sx][sy][0] = 0;
    109         BFS ();
    110 
    111         int mn = INF;
    112         for (int i=0; i<4; ++i)
    113         {
    114             if (ans[ex][ey][i] == -1)    continue;
    115             mn = min (mn, ans[ex][ey][i]);
    116         }
    117 
    118         if (mn == INF)  printf ("YouBadbad
    ");
    119         else    printf ("%d
    ", mn);
    120     }
    121 
    122     return 0;
    123 }
    编译人生,运行世界!
  • 相关阅读:
    通过图像识别技术监控屏幕画面卡死问题
    人生四问
    bring to front 必须在右边的form上才生效。
    ADO 右键问题,当dbgrideh非只读的时候,会遇到这个问题
    K-Means聚类算法
    BIRCH算法---使用聚类特征树的多阶段算法
    BIRCH算法---使用聚类特征树的多阶段算法
    分布式系统阅读笔记(二十二)-----时钟和时钟同步
    分布式系统阅读笔记(二十二)-----时钟和时钟同步
    分布式系统阅读笔记(二十二)-----时钟和时钟同步
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4461352.html
Copyright © 2020-2023  润新知