HDU 1429 (bfs+状态的位压缩)

hdu 1429 胜利大逃亡(续)

一共有10把钥匙,用10位的二进制反映钥匙的拥有情况

#include <iostream>
#include <cstring>
#include<cstdio>
#include <queue>
using namespace std;
char maze[21][21];
int n,m,t;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int vis[1024][21][21];     //2^10-1 = 1023
typedef struct node{
    int x,y,key,step;
}Node;
queue<Node> q;
int bfs(int sx,int sy){
    while (!q.empty()) q.pop();
    vis[0][sx][sy]=1;
    Node s={sx,sy,0,0};
    q.push(s);
    while(!q.empty()){
        Node u = q.front();
        q.pop();
        int x,y,key,step,nx,ny,nkey,nstep,d;
        x=u.x; y=u.y; key=u.key; step=u.step;
        if(step >= t-1) return -1;
        for(d = 0;d < 4;d ++){
            nx=x+dx[d]; ny=y+dy[d]; nkey=key;
            if (!maze[nx][ny] || maze[nx][ny]==‘*‘) continue;
            if (isupper(maze[nx][ny]))
             {
                int t=maze[nx][ny]-‘A‘;
                if (!(key&(1<<t))) continue;      //钥匙不匹配
             }
             if (islower(maze[nx][ny]))
             {
                 int t=maze[nx][ny]-‘a‘;
                 nkey=key|(1<<t);                 //更新钥匙状态
             }
             if (vis[nkey][nx][ny]) continue;
             vis[nkey][nx][ny]=1;
             nstep=step+1;
             node v={nx,ny,nkey,nstep};
             if (maze[v.x][v.y]==‘^‘)
                return v.step;
             q.push(v);
         }
        }
        return -1;
}
int main()
{
    int x,y,ans,i,j;
    while(cin >> n >> m >> t){
        memset(vis,0,sizeof(vis));
        for (i=1;i<=n;i++)
            scanf("%s",maze[i]+1);
        for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
             if (maze[i][j]==‘@‘)
             {
                 x=i; y=j;
                 maze[i][j]=‘.‘;
             }
        ans = bfs(x,y);
        cout << ans << endl;
        for (i=0;i<=n+1;i++){
        for (j=0;j<=m+2;j++){
            cout << maze[i][j] << " ";
        }
        cout << endl;}

    }
    return 0;
}
时间: 2024-11-12 18:29:19

HDU 1429 (bfs+状态的位压缩)的相关文章

hdu 1429(BFS+状态压缩)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7895    Accepted Submission(s): 2795 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这 次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了

HDU 1429 (BFS+记忆化状压搜索)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1429 题目大意:最短时间内出迷宫,可以走回头路,迷宫内有不同的门,对应不同的钥匙. 解题思路: 要是没有门和钥匙,而且不能走回头路,就是个简单粗暴的BFS. 有了门之后,就要状态压缩+记忆化搜索.不然这个图会搜死你. 本题的状态压缩基于一个事实:尽管可以走回头路,但是回头是有理由的,你要么开了门,要么拿了钥匙,使状态发生改变. 否则等于多绕了一步,浪费时间,应该及时剪枝. f[x][y][key]

hdu 3502 bfs+状态压缩dp

题意是给你n*m的矩阵     每个单位有一个数,-1表示不能走   >=0表示有有多少个能量能获得    问从左上角到右下角能获得的做大能量值(走一步消耗1单位能量) 思路:  先bfs求出所有线之间的最短距离(当然  有用的只有有能量值的点和起点,终点) 然后状态压缩dp  找到最大能量值    这里有几个注意的地方 状态尽量从1开始    减少数组的空间(爆了一次)   其次是bfs是只搜有能量的点     其它都差不多: #include<stdio.h> #include<

HDU 1885 BFS+状态压缩

Key Task Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1239    Accepted Submission(s): 495 Problem Description The Czech Technical University is rather old - you already know that it celebrat

hdu 1429 bfs+状压

题意:这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开始 Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置.Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一 个.魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去.经过若干次的尝试,Ignatius已画出整个地牢的地图.现在请你帮 他计算能否再次成功逃亡.只要在魔王下次视察之前走到出口就算离开地牢

HDU 4012 Paint on a Wall(BFS+位压缩)(好题)

题意:这题的意思有一个2*n的矩形,要给这个矩形涂色每次可以涂一个矩形形状的某种颜色,允许新颜色覆盖旧的颜色求最少多少步可以求出.(1<=n<=8) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4012 准备拿这题学位压缩,结果看不懂题解...,然后一气之下去学状压dp...才看懂了什么是位压缩,才看懂了这题的题解,然后自己码出来了,一题好题就这么被我水掉了... 思路:每次涂色以后必有一个格子的颜色是最终的颜色,否则这次涂色根本没意义,所以我

hdu 4856 Tunnels(bfs+状态压缩)

题目链接:hdu 4856 Tunnels 题目大意:给定一张图,图上有M个管道,管道给定入口和出口,单向,现在有人想要体验下这M个管道,问最短需要移动的距离,起点未定. 解题思路:首先用bfs处理出两两管道之间移动的距离,然后后用状态压缩求出最短代价,dp[i][j],i表示的已经走过的管道,j是当前所在的管道. #include <cstdio> #include <cstring> #include <queue> #include <algorithm&g

HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)

题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP 用最短路预处理出状态的转移.能够优化非常多 AC代码: #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <queue> us

HDU 3247 Resource Archiver (AC自动机 + BFS + 状态压缩DP)

题目链接:Resource Archiver 解析:n个正常的串,m个病毒串,问包含所有正常串(可重叠)且不包含任何病毒串的字符串的最小长度为多少. AC自动机 + bfs + 状态压缩DP 用最短路预处理出状态的转移.可以优化很多 AC代码: #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <queue> using n