基础广搜题,注意是用位运算来判断的是否有钥匙的。
少写一个字母找了好久的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 0x7fffffff
using 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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u014355480/article/details/47264503