hdu 2312 Cliff Climbing (pfs)

Problem - 2312

  一条很暴力,有点恶心的搜索。题意其实很简单,主要是pfs的时候拓展结点会有种麻烦的感觉。注意的是,这里的n和m跟平常见到的有所不同,交换过来了。我的代码就是在因为这个长宽的问题wa了一次。

代码如下:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <queue>
 6 #include <cctype>
 7 
 8 using namespace std;
 9 
10 typedef pair<int, int> PII;
11 typedef pair<PII, PII> PPP;
12 typedef pair<int, PPP> PPPI;
13 
14 #define FI first
15 #define SE second
16 #define PRIQ priority_queue
17 
18 const int R = 66;
19 const int C = 33;
20 char mat[R][C];
21 bool vis[R][C][R][C];
22 int n, m;
23 
24 inline int dis(int a, int b, int c, int d) { return abs(a - c) + abs(b - d);}
25 inline bool inmat(int a, int b) { return 0 <= a && a < n && 0 <= b && b < m;}
26 
27 int work() {
28     PRIQ<PPPI> Q;
29     int nx, ny, cx, cy;
30     memset(vis, 0, sizeof(vis));
31     while (!Q.empty()) Q.pop();
32     for (int i = 0; i < n; i++) {
33         for (int j = 0; j < m; j++) {
34             if (mat[i][j] != 'S') continue;
35             for (int dx = -2; dx <= 2; dx++) {
36                 nx = i + dx;
37                 for (int dy = 1; dy <= 3; dy++) {
38                     ny = j + dy;
39                     if (inmat(nx, ny) && dis(i, j, nx, ny) <= 3 && mat[nx][ny] != 'X' && !vis[i][j][nx][ny]) {
40                         if (isdigit(mat[nx][ny])) Q.push(PPPI((int) '0' - mat[nx][ny], PPP(PII(i, j), PII(nx, ny))));
41                         else Q.push(PPPI(0, PPP(PII(i, j), PII(nx, ny))));
42                         vis[i][j][nx][ny] = true;
43 //                        cout << i << ' ' << j << ' ' << nx << ' ' << ny << endl;
44                     }
45                     ny = j - dy;
46                     if (inmat(nx, ny) && dis(nx, ny, i, j) <= 3 && mat[nx][ny] != 'X' && !vis[nx][ny][i][j]) {
47                         if (isdigit(mat[nx][ny])) Q.push(PPPI((int) '0' - mat[nx][ny], PPP(PII(nx, ny), PII(i, j))));
48                         else Q.push(PPPI(0, PPP(PII(nx, ny), PII(i, j))));
49                         vis[nx][ny][i][j] = true;
50 //                        cout << nx << ' ' << ny << ' ' << i << ' ' << j << endl;
51                     }
52                 }
53             }
54         }
55     }
56 //    cout << "find S" << endl;
57     while (!Q.empty()) {
58         PPPI cur = Q.top();
59         Q.pop();
60         int v = cur.FI, a = cur.SE.FI.FI, b = cur.SE.FI.SE, c = cur.SE.SE.FI, d = cur.SE.SE.SE;
61 //        cout << v << ' ' << a << ' ' << b << ' ' << c << ' ' << d << endl;
62         if (mat[a][b] == 'T' || mat[c][d] == 'T') return -v;
63         for (int dx = -2; dx <= 2; dx++) {
64             nx = a + dx;
65             cx = c + dx;
66             for (int dy = 1; dy <= 3; dy++) {
67                 ny = b + dy;
68                 if (inmat(nx, ny) && dis(a, b, nx, ny) <= 3 && mat[nx][ny] != 'X' && !vis[a][b][nx][ny]) {
69                     if (isdigit(mat[nx][ny])) Q.push(PPPI((int) '0' - mat[nx][ny] + v, PPP(PII(a, b), PII(nx, ny))));
70                     else Q.push(PPPI(v, PPP(PII(a, b), PII(nx, ny))));
71                     vis[a][b][nx][ny] = true;
72 //                    cout << nx << ' ' << ny << endl;
73                 }
74                 cy = d - dy;
75                 if (inmat(cx, cy) && dis(cx, cy, c, d) <= 3 && mat[cx][cy] != 'X' && !vis[cx][cy][c][d]) {
76                     if (isdigit(mat[cx][cy])) Q.push(PPPI((int) '0' - mat[cx][cy] + v, PPP(PII(cx, cy), PII(c, d))));
77                     else Q.push(PPPI(v, PPP(PII(cx, cy), PII(c, d))));
78                     vis[cx][cy][c][d] = true;
79 //                    cout << cx << ' ' << cy << endl;
80                 }
81             }
82         }
83     }
84     return -1;
85 }
86 
87 int main() {
88 //    freopen("in", "r", stdin);
89 //    freopen("out", "w", stdout);
90     while (cin >> m >> n && (n || m)) {
91         char buf[3];
92         for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) cin >> buf, mat[i][j] = buf[0];
93         cout << work() << endl;
94     }
95     return 0;
96 }
View Code

 

——written by Lyon

转载于:https://www.cnblogs.com/LyonLys/p/hdu_2312_Lyon.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值