hdu5094 状态压缩dp+dps
2017-04-06 00:10
176 查看
题目大意:给定一个棋盘,要求从(1,1)走到(n,m),相邻格子之前可能是墙,门或者什么都没有,墙的话就无法通过, 门的话就必须有对应的钥匙才能通过,要求求出最少的步数,若无法到达就输出1。
调试了近两个小时,一直找不到错在哪,后来看了别人的程序,发现忘记考虑1*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; }
相关文章推荐
- hdoj1074 Doing Homework(好题呀,状态压缩+DP)
- hdu1074 Doing Homework(状态压缩DP Y=Y)
- Uva 10817 Headmaster's Headache (DP+ 状态压缩)
- HDU 4049 状态压缩DP
- 【dp-状态压缩】炮兵阵地
- POJ 2288 Islands and Bridges (TSP 状态压缩DP)
- POJ 2441 Arrange the Bulls 状态压缩DP
- poj 2441 Arrange the Bulls(状态压缩dp)
- 洛谷 1052 dp 状态压缩
- 状态压缩 DP 入门课堂笔记
- poj 2836 Rectangular Covering(状态压缩dp)
- BNU25359Escape Time II(状态压缩DP)
- HDU 1400 Mondriaan's Dream [状态压缩DP]
- poj 1185 炮兵阵地 【状态压缩dp】
- SGU223 状态压缩DP
- poj 1185 & hdu 4539(状态压缩DP)
- hdu 2825(ac自动机+状态压缩dp)
- hdu 4628(状态压缩dp)
- 【状态压缩DP】互不侵犯
- poj 1185 炮兵阵地 状态压缩dp