码迷,mamicode.com
首页 > 其他好文 > 详细

BFS+二进制状态压缩 hdu-1429

时间:2016-10-08 23:49:33      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

好久没写搜索题了,就当练手吧。

vis[][][1025]第三个维度用来维护不同key持有状态的访问情况。

对于只有钥匙没有对应门的位置,置为‘.‘,避免不必要的状态分支。

//
//  main.cpp
//  hdu_1429
//
//  Created by Luke on 16/10/8.
//  Copyright © 2016年 Luke. All rights reserved.
//

#include <iostream>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
int n,m,t;
int ex,ey;
char Map[25][25];
int bit[10];
struct Node
{
    int y,x;
    int key;
    int step;
};
bool vis[25][25][1025];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
bool ok(Node &te)
{
    if(te.step>=t)
        return false;
    if(te.y<0||te.y>=n||te.x<0||te.x>=m)
        return false;
    if(vis[te.y][te.x][te.key])
        return false;
    if(Map[te.y][te.x]==*)
        return false;
    if(Map[te.y][te.x]>=A&&Map[te.y][te.x]<=J)
    {
        int fix=bit[Map[te.y][te.x]-A];
        if(!(fix&te.key))
            return false;
    }
    if(Map[te.y][te.x]>=a&&Map[te.y][te.x]<=j)
        te.key|=bit[Map[te.y][te.x]-a];
    vis[te.y][te.x][te.key]=1;
    return true;
}
int bfs(int sy,int sx)
{
    queue<Node> q;
    q.push((Node){sy,sx,0,0});
    memset(vis,0,sizeof(vis));
    Node now,nx;
    while(!q.empty())
    {
        now=q.front(),q.pop();
        if(now.y==ey&&now.x==ex)
            return now.step;
        for(int i=0;i<4;i++)
        {
            nx=now;
            nx.y+=dir[i][0],nx.x+=dir[i][1];
            nx.step++;
            if(ok(nx))
                q.push(nx);
        }
    }
    return -1;
}
int main(int argc, const char * argv[]) {
    cin.sync_with_stdio(false);
    bit[0]=1;
    for(int i=1;i<10;i++)
        bit[i]=bit[i-1]<<1;
    while(cin>>n>>m>>t)
    {
        int sx,sy;
        bool fix[10];
        memset(fix,0,sizeof(fix));
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                cin>>Map[i][j];
                if(Map[i][j]>=A&&Map[i][j]<=J)
                    fix[Map[i][j]-A]=1;
                if(Map[i][j]==^)
                    ex=j,ey=i;
                if(Map[i][j]==@)
                    sx=j,sy=i;
            }
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(Map[i][j]>=a&&Map[i][j]<=j)
                    if(!fix[Map[i][j]-a])
                        Map[i][j]=.;
        cout<<bfs(sy,sx)<<endl;
    }
    return 0;
}

 

BFS+二进制状态压缩 hdu-1429

标签:

原文地址:http://www.cnblogs.com/LukeStepByStep/p/5940214.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!