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 }

 

posted on 2013-03-23 23:40  yzcstc  阅读(261)  评论(0编辑  收藏  举报