hdu 1885 Key Task(bfs+状态压缩)

来源:互联网 发布:三滴水一个乎 编辑:程序博客网 时间:2024/06/05 15:03

Key Task

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1885

解题思路:

状态压缩,使用二进制分别存储每把钥匙是否拥有的状态,然后当遇到门时,查看此时相应的二进制位数上是否有相应的钥匙,如

果有,则进队列,继续搜就行了。直到找到终点为止。。。

AC代码:

#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;struct node{    int x,y,t;    int key;//用二进制存4把钥匙  };const int dx[] = {-1,0,1,0}, dy[] = {0,-1,0,1};const char key[] = {'b','y','r','g'};const char door[] = {'B','Y','R','G'};char maze[110][110];int vis[110][110][20];//判断在有不同的key的各个位置是否出现过  int n,m;void bfs(int x,int y){    memset(vis,0,sizeof(vis));    queue<node> q;    node cur;    cur.x = x;cur.y = y;cur.t = 0;cur.key = 0;    q.push(cur);    vis[cur.x][cur.y][cur.key] = 1;    while(!q.empty()){        cur = q.front();        q.pop();        if(maze[cur.x][cur.y] == 'X'){            printf("Escape possible in %d steps.\n",cur.t);            return;        }        //printf("\n%d %d %d %d\n",cur.x,cur.y,cur.t,cur.key);        node tmp;        for(int i = 0; i < 4; i++){            //cout<<cur.key<<endl;            tmp.x = cur.x+dx[i];tmp.y = cur.y+dy[i];tmp.t = cur.t+1;tmp.key = cur.key;            //printf("%d %d %d %d\n",tmp.x,tmp.y,tmp.t,tmp.key);            if(tmp.x<0 || tmp.x>=n || tmp.y<0 || tmp.y>=m || maze[tmp.x][tmp.y] == '#')                continue;            if(islower(maze[tmp.x][tmp.y])){                for(int j = 0; j < 4; j++){                    if(maze[tmp.x][tmp.y] == key[j]){                        //printf("%d %d %d %d11\n",tmp.x,tmp.y,tmp.t,tmp.key);                        tmp.key |= (1<<j);                        if(!vis[tmp.x][tmp.y][tmp.key]){                            //key记录得到这把钥匙                             vis[tmp.x][tmp.y][tmp.key] = 1;                            q.push(tmp);                        }                        break;                    }                }            }            else if(isupper(maze[tmp.x][tmp.y]) && maze[tmp.x][tmp.y] != 'X'){                //找到对应的门,且有该门的钥匙,且在这种状态下的这个位置未走过                 for(int j = 0; j < 4; j++){                    if(maze[tmp.x][tmp.y] == door[j] && (tmp.key & (1<<j)) && !vis[tmp.x][tmp.y][tmp.key]){                        vis[tmp.x][tmp.y][tmp.key] = 1;                        q.push(tmp);                        break;                    }                }            }            else if(!vis[tmp.x][tmp.y][tmp.key]){                vis[tmp.x][tmp.y][tmp.key] = 1;                q.push(tmp);            }        }    }    printf("The poor student is trapped!\n");}int main(){    while(scanf("%d%d",&n,&m),n+m){        for(int i = 0; i < n; i++)            scanf("%s",maze[i]);        for(int i = 0;i < n; i++)            for(int j = 0;j < m; j++){                if(maze[i][j] == '*'){                    bfs(i,j);                    break;                }            }    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魅族metal手机好卡怎么办 魅蓝手机锁机了怎么办 魅族note2屏坏了怎么办 魅族mx3开不开机怎么办 魅蓝max3充电慢怎么办? 魅族手机home键失灵怎么办 魅族开关键坏了怎么办 魅族开关键不灵怎么办 魅蓝开机键坏了怎么办 魅族开关机坏了怎么办 小米开机键坏了怎么办 魅族手机关机键失灵怎么办 魅蓝5s发热严重怎么办 华为荣耀v8信号差怎么办 贴膜白边去除液漏进屏幕里面怎么办 魅族pro6s电池休眠了怎么办 京东预约错了怎么办 魅蓝手机声音小怎么办 魅族2手机锁定了怎么办 flyme的密码忘了怎么办 魅族note3忘记开机密码怎么办 小米3s手机死机怎么办 二手小米手机有账号锁怎么办 小米五指纹解锁失灵怎么办 小米note3指纹解锁失灵怎么办 小米4s手机屏幕失灵怎么办 vivo手机没有otg功能怎么办 头戴耳机压头发怎么办 小米4c很卡怎么办 小米4c玩王者怎么办 小米4s屏幕乱跳怎么办 小米4s手机后壳碎了怎么办 小米5spius开不了机怎么办 小米5s无限重启怎么办 小米5s外屏坏了怎么办 小米5s内屏碎了怎么办 小米4充电没反应怎么办 小米5手机变卡了怎么办 小米5变卡了怎么办 小米手机充电无反应怎么办 小米6相机卡顿怎么办