首页 > 代码库 > hdu4845 状态压缩搜索水题

hdu4845 状态压缩搜索水题

  

这道题简单来说是和胜利大逃亡续类似的题  只不过这道题没有给你明确的地图 只给了你点之间的关系          唯一的坑点在于一个点可能有多把钥匙


#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;


struct node
{
int x,y,step,state;
}a,b;
int mark[16][16][3030];
int n,m,p;
int wall[16][16][16][16],key[16][16][15],flash;
int dis[4][2]={0,1,0,-1,1,0,-1,0};
int bfs()
{
int i,j;
a.x=1;
a.y=1;
a.state=0;
if(key[a.x][a.y][0]!=0)
{
//a.state=(1<<key[a.x][a.y]);
for(j=1;j<=key[a.x][a.y][0];j++)
{
a.state=a.state|(1<<key[a.x][a.y][j]);
}
}
a.step=0;
memset(mark,0,sizeof(mark));
mark[a.x][a.y][a.state]=1;
queue<node>q;
q.push(a);
while(!q.empty())
{
b=q.front();
q.pop();
if(b.x==n&&b.y==m)
{
printf("%d\n",b.step);
flash=1;
return 0;
}
for(i=0;i<4;i++)
{
a.x=b.x+dis[i][0];
a.y=b.y+dis[i][1];
a.step=b.step+1;
int t=b.state;
if(a.x<1||a.x>n||a.y<1||a.y>m) continue;
if(wall[b.x][b.y][a.x][a.y]==0) continue;
else if(wall[b.x][b.y][a.x][a.y]<0)
{
if(key[a.x][a.y][0])
{
for(j=1;j<=key[a.x][a.y][0];j++)
{
t=t|(1<<key[a.x][a.y][j]);
}
}
if(mark[a.x][a.y][t]==0)
{
mark[a.x][a.y][t]=1;
a.state=t;
q.push(a);
}
}
else
{
int x=1<<wall[b.x][b.y][a.x][a.y];
if(t&x)
{
if(key[a.x][a.y][0])
{
for(j=1;j<=key[a.x][a.y][0];j++)
{
t=t|(1<<key[a.x][a.y][j]);
}
}
if(mark[a.x][a.y][t]==0)
{
mark[a.x][a.y][t]=1;
a.state=t;
q.push(a);
}
}
}
}
}
return 0;
}
int main()
{
int i,j,k,x,x1,x2,y1,y2,y,z;
while(~scanf("%d%d%d",&n,&m,&p))
{
memset(wall,-1,sizeof(wall));
memset(key,0,sizeof(key));
scanf("%d",&k);
for(i=1;i<=k;i++)
{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&x);
wall[x1][y1][x2][y2]=wall[x2][y2][x1][y1]=x;
}
scanf("%d",&k);
for(i=1;i<=k;i++)
{
scanf("%d%d%d",&x,&y,&z);
key[x][y][0]++;
int s=key[x][y][0];
key[x][y][s]=z;
}
flash=0;
bfs();
if(!flash) printf("-1\n");
}
return 0;
}

hdu4845 状态压缩搜索水题