hdu 1429 bfs+状压

题意:这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始 Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一 个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮 他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。

每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为地牢的地图,其中包括:

. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J

 

记得去年网赛有这样一题,当时不会状压,搞不出来,现在看起来还是很水的

 

得到钥匙的状态用二进制表示,比如有A钥匙即为1,有A,C钥匙即为101

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #include<map>
  8 using namespace std;
  9 #define MOD 1000000007
 10 const int INF=0x3f3f3f3f;
 11 const double eps=1e-5;
 12 #define cl(a) memset(a,0,sizeof(a))
 13 #define ts printf("*****\n");
 14 const int MAXN=1005;
 15 int vis[25][25][1025];
 16 char s[25][25];
 17 int d[4][2]={1,0,0,1,-1,0,0,-1};
 18 int n,m,tt,time;
 19 struct node
 20 {
 21     int x,y,t,key;
 22     node(){}
 23     node(int xx,int yy,int tt,int kk)
 24     {
 25         x=xx,y=yy,t=tt,key=kk;
 26     }
 27 }st,ed;
 28 void bfs()
 29 {
 30     node now,next;
 31     queue<node> q;
 32     q.push(node(st.x,st.y,0,0));
 33     vis[st.x][st.y][0]=1;
 34     while(!q.empty())
 35     {
 36         now=q.front();
 37         q.pop();
 38         if(now.x==ed.x&&now.y==ed.y)
 39         {
 40             if(now.t<time)
 41             {
 42                 printf("%d\n",now.t);
 43                 return;
 44             }
 45             else
 46                 break;
 47         }
 48         for(int i=0;i<4;i++)
 49         {
 50             next.x=now.x+d[i][0];
 51             next.y=now.y+d[i][1];
 52             next.t=now.t+1;
 53             next.key=now.key;
 54             if(next.x>=0&&next.y>=0&&next.x<n&&next.y<m&&s[next.x][next.y]!='*')
 55             {
 56                 if('A'<=s[next.x][next.y]&&s[next.x][next.y]<='J')
 57                 {
 58                     int key=1<<(s[next.x][next.y]-'A');
 59                     if((next.key&key)&&!vis[next.x][next.y][next.key])
 60                     {
 61                         vis[next.x][next.y][next.key]=1;
 62                         q.push(next);
 63                     }
 64                 }
 65                 else if(s[next.x][next.y]>='a'&&s[next.x][next.y]<='j')
 66                 {
 67                     int key=(1<<(s[next.x][next.y]-'a'));
 68                     next.key=(next.key|key);
 69                     if(!vis[next.x][next.y][next.key])
 70                     {
 71                         vis[next.x][next.y][next.key]=1;
 72                         q.push(next);
 73                     }
 74                 }
 75                 else
 76                 {
 77                     if(!vis[next.x][next.y][next.key])
 78                     {
 79                         vis[next.x][next.y][next.key]=1;
 80                         q.push(next);
 81                     }
 82                 }
 83             }
 84         }
 85     }
 86     printf("-1\n");
 87 
 88 }
 89 int main()
 90 {
 91     int i,j,k;
 92     #ifndef ONLINE_JUDGE
 93     freopen("1.in","r",stdin);
 94     #endif
 95     while(scanf("%d%d%d",&n,&m,&time)!=EOF)
 96     {
 97         for(i=0;i<n;i++)
 98         {
 99             scanf("%s",s[i]);
100             for(j=0;j<m;j++)
101             {
102                 if(s[i][j]=='@')    st.x=i,st.y=j;
103                 if(s[i][j]=='^')    ed.x=i,ed.y=j;
104             }
105         }
106         memset(vis,0,sizeof(vis));
107         bfs();
108     }
109 }

 

posted @ 2015-04-25 08:50  miao_a_miao  阅读(113)  评论(0编辑  收藏  举报