zoukankan      html  css  js  c++  java
  • ICPC Pacific Northwest Regional Contest 2016 C. Buggy Robot


    Buggy Robot  

    思路:dp[inx][x][y],表示用了前inx个指令后的最小费用。

    对于一个指令,我们可以选择不走或者走,其他的我们可以添加四个方向的指令与使用过指令后的dp来比较。

      1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstdio>
      4 #include <queue>
      5 #include <cstring>
      6 
      7 using namespace std;
      8 
      9 const int N = 60;
     10 const int INF = 1e9;
     11 int mv_x[] = {1, -1, 0, 0};
     12 int mv_y[] = {0, 0, -1, 1};
     13 char mp[N][N];
     14 int dp[N][N][N];
     15 char str[N];
     16 int n, m;
     17 
     18 struct node
     19 {
     20     int inx, x, y;
     21 }R, E;
     22 
     23 bool inline check(int x, int y)
     24 {
     25     return x >= 0 && x < n && y >= 0 && y < m;
     26 }
     27 
     28 void bfs()
     29 {
     30     for(int i = 0; i < N; ++i)
     31         for(int j = 0; j < N; ++j)
     32             for(int k = 0; k < N; ++k)
     33                 dp[i][j][k] = INF;
     34 
     35     int len = strlen(str);
     36     queue<node > que; 
     37 
     38     dp[0][R.x][R.y] = 0;
     39     que.push({0, R.x, R.y});
     40 
     41     while(!que.empty()){
     42         node now = que.front();
     43         que.pop();
     44 
     45         for(int p = 0; p < 4; ++p){
     46             int dx = now.x + mv_x[p];
     47             int dy = now.y + mv_y[p];
     48 
     49             if(check(dx, dy) && mp[dx][dy] != '#'){
     50                 if(dp[now.inx][now.x][now.y] + 1 < dp[now.inx][dx][dy]){
     51                     dp[now.inx][dx][dy] = dp[now.inx][now.x][now.y] + 1;
     52                     que.push({now.inx, dx, dy});
     53                 }
     54             }
     55 
     56             if(now.inx < len){
     57                 //不走
     58                 if(dp[now.inx][now.x][now.y] + 1 < dp[now.inx + 1][now.x][now.y]){
     59                     dp[now.inx + 1][now.x][now.y] = dp[now.inx][now.x][now.y] + 1;
     60                     que.push({now.inx + 1, now.x, now.y}); 
     61                 }
     62 
     63                 //
     64                 dx = now.x; 
     65                 dy = now.y;
     66                 if(str[now.inx] == 'L') dy--;
     67                 if(str[now.inx] == 'R') dy++;
     68                 if(str[now.inx] == 'U') dx--;
     69                 if(str[now.inx] == 'D') dx++;
     70                 if(!check(dx,dy) || mp[dx][dy] == '#') dx = now.x, dy = now.y;
     71                 if(dp[now.inx][now.x][now.y] < dp[now.inx + 1][dx][dy]){
     72                     dp[now.inx + 1][dx][dy] = dp[now.inx][now.x][now.y];
     73                     que.push({now.inx + 1, dx, dy}); 
     74                 }                
     75             }
     76         }
     77     }
     78 }
     79 
     80 void solve()
     81 {
     82     scanf("%d%d", &n, &m);
     83     for(int i = 0; i < n; ++i) scanf("%s", mp[i]);
     84     scanf("%s", str);
     85     //cout << "len = " << (strlen(str)) << endl;
     86     
     87     for(int i = 0; i < n; ++i){
     88         for(int j = 0; j < m; ++j){
     89             if(mp[i][j] == 'R'){
     90                 R.x = i; R.y = j;
     91             }
     92             if(mp[i][j] == 'E'){
     93                 E.x = i; E.y = j;
     94             }
     95         }
     96     }
     97 
     98     bfs();
     99 
    100     int ans = INF;
    101     for(int i = 0; i < N; ++i){
    102         ans = min(ans, dp[i][E.x][E.y]);
    103     }
    104     //printf("ans = %d
    ", ans);
    105     printf("%d
    ", ans);
    106 }
    107 
    108 
    109 int main()
    110 {
    111 
    112     solve();
    113 
    114     return 0;
    115 }
  • 相关阅读:
    Max History CodeForces
    Buy a Ticket CodeForces
    AC日记——字符串的展开 openjudge 1.7 35
    AC日记——回文子串 openjudge 1.7 34
    AC日记——判断字符串是否为回文 openjudge 1.7 33
    AC日记——行程长度编码 openjudge 1.7 32
    AC日记——字符串P型编码 openjudge 1.7 31
    AC日记——字符环 openjudge 1.7 30
    AC日记——ISBN号码 openjudge 1.7 29
    AC日记——单词倒排 1.7 28
  • 原文地址:https://www.cnblogs.com/SSummerZzz/p/13187737.html
Copyright © 2011-2022 走看看