您的位置:首页 > 其它

hdu1885 状压搜索 板子

2016-03-15 20:08 295 查看
// hdu 1885 状压搜索入门
//
// 题目意思很简单,四种钥匙四种门,在状态里面
// 加入钥匙的二进制压缩,输出答案,就好了...
// 记一下板子

#include <cstdio>
#include <cmath>
#include <map>
#include <queue>
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MAX_N = 109;
const int MOD = 1e9 + 7;
const double PI = acos(-1);

int n,m;

bool vis[MAX_N][MAX_N][20];

const int dx[4] = {
-1,0,1,0
};
const int dy[4] = {
0,1,0,-1
};

char g[MAX_N][MAX_N];

struct Point{
int x;
int y;
int key;
int ans;
Point(){

}

Point(int x,int y,int key,int ans):x(x),y(y),key(key),ans(ans){

}
};

void print(){
printf("The poor student is trapped!\n");
}
int sx,sy;

bool in(int x,int y){
if (x >= 1 && x <= n && y >=1 && y <= m)
return true;
return false;
}

int idx(char c){
switch(c){
case 'B':
case 'b':
return 0;
case 'Y':
case 'y':
return 1;
case 'R':
case 'r':
return 2;
case 'G':
case 'g':
return 3;
}
}

void bfs(){
queue<Point> que;

Point u;
u.x = sx;
u.y = sy;
u.key = 0;
u.ans = 0;
que.push(u);

vis[sx][sy][0] = 1;

int st = 0;
int k = 0;
while(!que.empty()){
u = que.front();
que.pop();

for (int i = 0 ;i < 4;i ++){
int tx = u.x + dx[i];
int ty = u.y + dy[i];

if (!in(tx,ty))
continue;
if (g[tx][ty] == '#')
continue;
if(g[tx][ty] == 'X'){
printf("Escape possible in %d steps.\n",u.ans+1);
return ;
}

st = u.key;

k = idx(g[tx][ty]);

if(g[tx][ty] >= 'A' && g[tx][ty] <= 'Z'){
if (st & (1 << k) && !vis[tx][ty][st]){
vis[tx][ty][st] = 1;
que.push(Point(tx,ty,st,u.ans + 1));
}
}
else if (g[tx][ty] >= 'a' && g[tx][ty] <= 'z'){
st |= (1 << k);
if (vis[tx][ty][st])
continue;
vis[tx][ty][st] = 1;
que.push(Point(tx,ty,st,u.ans + 1));
}else {
if (!vis[tx][ty][st]){
vis[tx][ty][st] = 1;
que.push(Point(tx,ty,st,u.ans+1));
}
}
}
}
print();
}

void input(){
for (int i = 1;i <= n;i ++)
scanf("%s",g[i] + 1);
memset(vis,0,sizeof(vis));
for (int i = 1;i <= n;i ++){
for (int j = 1;j <= m;j ++){
if (g[i][j] == '*'){
sx = i;
sy = j;
break;
}
}
}
//print();
bfs();
}

int main(){
//freopen("te.txt","r",stdin);

while(scanf("%d%d",&n,&m)!=EOF && n && m){
input();
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息