您的位置:首页 > 其它

hdu5094 状态压缩dp+dps

2017-04-06 00:10 176 查看
题目大意:给定一个棋盘,要求从(1,1)走到(n,m),相邻格子之前可能是墙,门或者什么都没有,墙的话就无法通过,         门的话就必须有对应的钥匙才能通过,要求求出最少的步数,若无法到达就输出1。

调试了近两个小时,一直找不到错在哪,后来看了别人的程序,发现忘记考虑1*1的棋盘了。真是哔了狗了。

题很简单,就是对状态压缩的入门,然后复习一下棋盘的最短路的代码,自己还是太菜了,最短路的代码打了那么多次,还是很慢,而且调试的时候又出现很多错。

别的不说上代码

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<cstdio>
#include<queue>
#include <iomanip>
#include <cmath>

using namespace std;
#define ALL(x) (x.begin(),x.end());
#define PI acos(-1,0);
typedef long long ll;
const int MAXN = 100000;
int n,m,p;
int wall[51][51][51][51];
bool vis[51][51][1<<10];
int key[51][51];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int ans;
struct node
{
int x,y;
int key;
int d;
node(int _x,int _y,int _key,int _d){
x=_x;
y=_y;
key=_key;
d=_d;
}
};

bool check(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m)return true;
else return false;
}
void init()
{

memset(vis,0,sizeof(vis));
ans=0;
int tmp;
scanf("%d",&tmp);
memset(wall,0,sizeof(wall));
for(int i=0;i<tmp;i++){
int x1,x2,y1,y2,t;
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&t);
wall[x1][y1][x2][y2]|=(1<<t);
wall[x2][y2][x1][y1]|=(1<<t);
}
scanf("%d",&tmp);
memset(key,0,sizeof(key));
for(int i=0;i<tmp;i++){
int x,y,ke;
scanf("%d%d%d",&x,&y,&ke);
key[x][y]|=(1<<ke);
}

}
int bfs()
{
queue <node> q;
q.push(node(1,1,key[1][1],0));
memset(vis,0,sizeof(vis));
while(!q.empty()){
int ux,uy,ukey,ud;
node now=q.front();q.pop();
ux=now.x;uy=now.y;ukey=now.key;ud=now.d;
if(ux==n&&uy==m){
return ud;
}
if(vis[ux][uy][ukey]) continue;
vis[ux][uy][ukey]=1;
for(int i=0;i<4;i++){
int vx,vy,vkey,vd;
vx=ux+dx[i];vy=uy+dy[i];vkey=ukey|key[vx][vy];vd=ud+1;
if(!check(vx,vy))continue;			//越界
if(wall[ux][uy][vx][vy]&1==1)continue;	//是墙
if(wall>0&&(ukey&wall[ux][uy][vx][vy])!=wall[ux][uy][vx][vy])continue;//没钥匙
q.push(node(vx,vy,vkey,vd));
}
}
return -1;
}
int main()
{

//freopen("aaa.in","r",stdin);
while(~scanf("%d%d%d",&n,&m,&p)){
init();
if(n==1&&m==1){  printf("0\n"); continue;}
printf("%d\n",bfs());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: