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 }
  • 相关阅读:
    Ubuntu打开终端的方法三种
    javascript 获取随机数
    HTML5中类jQuery选择器querySelector的使用
    PHP stream_context_create()作用和用法分析
    一些常用的api接口、
    怎么样学好C++
    指针访问与数组访问的效率分析
    架构师
    Java 之 StringTokenizer
    类型转换操作符static_cast、const_cast、dynamic_cast、reinterpret_cast
  • 原文地址:https://www.cnblogs.com/SSummerZzz/p/13187737.html
Copyright © 2011-2022 走看看