zoukankan      html  css  js  c++  java
  • poj1726

    黑书上的题目的加强版

    思路差不多。。这届看黑书p117例题4 ”舞蹈家“怀特先生

      1 /*
      2   State:Accepted
      3   Time:2013-03-10 02:44:14
      4 */
      5 #include <iostream>
      6 #include <cstring>
      7 #include <string>
      8 #include <cstdlib>
      9 #include <cstdio>
     10 #include <algorithm>
     11 #include <cmath>
     12 const int num[4][4]=
     13 {{3,5,5,7},
     14  {5,3,7,5},
     15  {5,7,3,5},
     16  {7,5,5,3}};
     17 using namespace std;
     18 int f[150][6][6][5] , lx[150][6][6][5] , ly[150][6][6][5],
     19     lz[150][6][6][5] , a[110];
     20 int n ,ans ,ansx, ansy, ansz;
     21 char s[105]; 
     22 const char  path[3]={'.','L','R'};
     23 
     24 bool left(int x, int y){ return  (x == 1 || x == 2) && y == 0; }
     25 bool right(int x , int y){ return (y == 1 || y == 2) && x == 3;}
     26 
     27 void updata(int i , int x , int y , int now){
     28      if (x == now || (!left(x ,y))){
     29            if (f[i+1][now][y][1] > f[i][x][y][0] + 1){
     30                  f[i+1][now][y][1] = f[i][x][y][0] + 1;          
     31                  lx[i+1][now][y][1] = x;
     32                  ly[i+1][now][y][1] = y;
     33                  lz[i+1][now][y][1] = 0;
     34            }
     35            if (f[i+1][now][y][1] > f[i][x][y][2] + 1){
     36                  f[i+1][now][y][1] = f[i][x][y][2] + 1;          
     37                  lx[i+1][now][y][1] = x;
     38                  ly[i+1][now][y][1] = y;
     39                  lz[i+1][now][y][1] = 2;
     40            }
     41            if (f[i+1][now][y][1] > f[i][x][y][1] + num[x][now]){
     42                  f[i+1][now][y][1] = f[i][x][y][1] + num[x][now];          
     43                  lx[i+1][now][y][1] = x;
     44                  ly[i+1][now][y][1] = y;
     45                  lz[i+1][now][y][1] = 1;
     46            }                 
     47      } 
     48      if (y == now || (!right(x ,y))){
     49            if (f[i+1][x][now][2] > f[i][x][y][0] + 1){
     50                  f[i+1][x][now][2] = f[i][x][y][0] + 1;           
     51                  lx[i+1][x][now][2] = x;
     52                  ly[i+1][x][now][2] = y;
     53                  lz[i+1][x][now][2] = 0;
     54            }
     55            if (f[i+1][x][now][2] > f[i][x][y][1] + 1){
     56                  f[i+1][x][now][2] = f[i][x][y][1] + 1;
     57                  lx[i+1][x][now][2] = x;
     58                  ly[i+1][x][now][2] = y;
     59                  lz[i+1][x][now][2] = 1;
     60            }
     61            if (f[i+1][x][now][2] > f[i][x][y][2] + num[y][now]){
     62                  f[i+1][x][now][2] = f[i][x][y][2] + num[y][now];           
     63                  lx[i+1][x][now][2] = x;
     64                  ly[i+1][x][now][2] = y;
     65                  lz[i+1][x][now][2] = 2;
     66            }                 
     67      }
     68      
     69 }
     70 
     71 void print(int i , int j, int k , int l){
     72       if  (i == 0) return;
     73       int x = lx[i][j][k][l];
     74       int y = ly[i][j][k][l];
     75       int z = lz[i][j][k][l];
     76       print(i - 1, x,y,z);
     77       printf("%c",path[l]);
     78 }
     79 
     80 void solve(){
     81       n = strlen(s);
     82       for (int i = 0; i < n; ++i){
     83            if (s[i] == '.' ) a[i + 1] = 4; 
     84            if (s[i] == 'L' ) a[i + 1] = 0;
     85            if (s[i] == 'U' ) a[i + 1] = 1;
     86            if (s[i] == 'D' ) a[i + 1] = 2;
     87            if (s[i] == 'R' ) a[i + 1] = 3;
     88       }
     89       for (int i = 0; i <= n ; ++i)
     90          for (int j = 0; j <= 4; ++j)
     91             for (int k = 0; k <= 4; ++k)
     92                 for (int l = 0; l <= 2; ++l)
     93                     f[i][j][k][l] = 100000000;
     94 
     95       f[0][0][3][0] = 0;
     96       for (int i = 0; i < n ; ++i)
     97          for (int j = 0; j < 4; ++j)
     98             for (int k = 0; k < 4; ++k)
     99                  if (j != k)
    100                     if (a[i + 1] != 4) updata(i , j, k , a[i+1]);
    101                     else {
    102                             for (int l = 0 ; l < 4; ++l) updata(i , j , k , l);
    103                             for (int l = 0; l <= 2; ++l)
    104                                 if (f[i+1][j][k][0] > f[i][j][k][l]){
    105                                    f[i+1][j][k][0] = f[i][j][k][l];
    106                                    lx[i+1][j][k][0] = j;
    107                                    ly[i+1][j][k][0] = k;
    108                                    lz[i+1][j][k][0] = l;
    109                             }
    110                          }
    111       ans = 100000000;
    112       for (int i = 0; i < 4; ++i)
    113           for (int j = 0; j < 4; ++j)
    114              for (int k = 0; k < 3; ++k)
    115                if (i != j && f[n][i][j][k] < ans){
    116                       ans = f[n][i][j][k];
    117                       ansx = i;
    118                       ansy = j;
    119                       ansz = k;
    120                }
    121       print(n, ansx ,ansy,ansz);
    122       printf("\n");
    123       
    124 
    125 }
    126 
    127 int main(){
    128      freopen("poj1726.in","r", stdin);
    129      freopen("poj1726.out","w",stdout);
    130      scanf("%s",&s);
    131      while (s[0] !='#'){
    132           solve();
    133           scanf("%s",&s);
    134      }
    135      
    136 }
  • 相关阅读:
    遍历查询ldap服务器用户
    spring调用存储过程
    jms在jboss上的简单应用
    开发团队如何完成一个项目?
    数据库分区表的使用
    使用native 查询时,对特殊字符的处理。
    spring定时器分析
    sql server监控
    java 类和接口之间的转换
    C++ main 参数使用
  • 原文地址:https://www.cnblogs.com/yzcstc/p/2977888.html
Copyright © 2011-2022 走看看