您的位置:首页 > 其它

hdu 1429 胜利大逃亡(续)

2015-10-02 20:44 381 查看
刚开始不知道有状态压缩,定义了一个这样的结构体

struct node()

{

int x,y;

int a[10];

int step;

};


数组a用来存放钥匙,然后代码写出来,MLE了。

遂查题解。知道了要用状态压缩,于是去学。

就是定义一个三维数组,第三维存储在某种状态下,是否走过map[x][y]位置。

某种状态可以这样定义:若钥匙种类不变即为相同状态,地图上每个位置相同状态只能经过一次。

可以用二进制表示是否有某种要是。

比如0000100000即表示为含有f钥匙。结合位运算,即可得出答案。

http://blog.csdn.net/yuhailin060/article/details/5482998

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=25;
#define MM(a) memset(a,NULL,sizeof(a));
int n,m,t;
int map

;
struct node
{
int x,y,step;
int key;
bool Logic()
{
if(x>=1&&y>=1&&x<=n&&y<=m&&map[x][y]!='*')
return true;
return false;
}
}start,cur,now;
int vis

[1050];
int dir[4][2]={1,0,-1,0,0,-1,0,1};
queue<node> q;
int bfs()
{
while(!q.empty())
{
cur=q.front(); q.pop();
if(t<=cur.step)
break;
if(map[cur.x][cur.y]=='^')
return cur.step;
for(int i=0;i<4;i++)
{
now=cur;
now.x+=dir[i][0];
now.y+=dir[i][1];
now.step++;
//cout<<now.x<<" "<<now.y<<endl;
if(now.Logic())
{
if(map[now.x][now.y]>='A'&&map[now.x][now.y]<='J')
{
int key=(map[now.x][now.y]-'A');
if((now.key>>key)&1&&!vis[now.x][now.y][now.key])
{
vis[now.x][now.y][now.key]=true;
q.push(now);
//cout<<now.x<<" "<<now.y<<endl;
}
}
else if(map[now.x][now.y]>='a'&&map[now.x][now.y]<='j')
{
int key=(1<<(map[now.x][now.y]-'a'));
now.key=(now.key|key);
if(!vis[now.x][now.y][now.key])
{
vis[now.x][now.y][now.key]=true;
q.push(now);
//cout<<now.x<<" "<<now.y<<endl;
}
}
else
{
if(!vis[now.x][now.y][now.key])
{
vis[now.x][now.y][now.key]=true;
q.push(now);
//cout<<now.x<<" "<<now.y<<endl;
}
}
}
}
}
return -1;
}
int main()
{
//freopen("in.txt","r",stdin);
while(cin>>n>>m>>t)
{
getchar();
MM(vis);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='@')
{
start.x=i;
start.y=j;
}
}
getchar();
}
while(!q.empty())
q.pop();
start.step=0;
start.key=0;
q.push(start);
cout<<bfs()<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  压缩