HDU - 1429 - 胜利大逃亡(续)

来源:互联网 发布:隐形眼镜推荐 知乎 编辑:程序博客网 时间:2024/05/16 09:59

胜利大逃亡(续)

题目传送:HDU - 1429 - 胜利大逃亡(续)

基础广搜题,注意是用位运算来判断的是否有钥匙的。

少写一个字母找了好久的bug。。好久的bug。。的bug。。bug。。g

AC代码:

#include <map>#include <set>#include <cmath>#include <deque>#include <queue>#include <stack>#include <cstdio>#include <cctype>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define INF 0x7fffffffusing namespace std;int n, m, t;bool vis[21][21][1 << 10];char mp[25][25];const int dx[] = {-1, 0, 1, 0};const int dy[] = {0, 1, 0, -1};struct node {    int x, y, t, state;    node() {}    node(int _x, int _y, int _t, int _state) : x(_x), y(_y), t(_t), state(_state) {}};int bfs(int x, int y) {    memset(vis, false, sizeof(vis));    queue<node> q;    q.push(node(x, y, 0, 0));    vis[x][y][0] = true;    while(!q.empty()) {        node cur = q.front();        q.pop();//      cout << cur.x << " " << cur.y << " " << cur.state << endl;        if(cur.t >= t-1) break;        for(int i = 0; i < 4; i ++) {            int xx = cur.x + dx[i];            int yy = cur.y + dy[i];            int tt = cur.t + 1;            int sta = cur.state;            if(xx < 0 || xx >= n || yy < 0 || yy >= m || mp[xx][yy] == '*' || vis[xx][yy][sta]) {                continue;            }//          cout << cur.x << " " << cur.y << " " << cur.state << endl;            if(isupper(mp[xx][yy]) && !(sta & (1 << (mp[xx][yy] - 'A'))) ) {                continue;            }            if(islower(mp[xx][yy])) {                sta |= (1 << (mp[xx][yy] - 'a'));            }            if(mp[xx][yy] == '^') {                return tt;            }            if(!vis[xx][yy][sta]) {                vis[xx][yy][sta] = true;                q.push(node(xx, yy, tt, sta));            }        }    }    return -1;}int main() {    while(scanf("%d %d %d", &n, &m, &t) != EOF) {        for(int i = 0; i < n; i ++ ){            scanf("%s", mp[i]);        }        int sx, sy;        for(int i = 0; i < n; i ++) {            for(int j = 0; j < m; j ++) {                if(mp[i][j] == '@') {                    sx = i;                    sy = j;                    break;                }            }        }        printf("%d\n", bfs(sx, sy));    }    return 0;}
0 0
原创粉丝点击