码迷,mamicode.com
首页 > 其他好文 > 详细

hdu--5093--状压bfs

时间:2014-11-15 20:15:40      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   os   sp   for   

主要就是开个 三维vis数组 第三维 表示在<x,y>坐标下的 钥匙有哪些

还有要注意的话 就是wall数组  是有3种不同的情况 -1 直接行走  0  墙   >=1 大门 需要钥匙

bubuko.com,布布扣
 1 #include <iostream>
 2 #include <cstring>
 3 #include <queue>
 4 using namespace std;
 5 
 6 int n , m;
 7 const int size = 55;
 8 int wall[size][size][size][size];
 9 int dir[4][2] = {1,0,-1,0,0,1,0,-1};
10 int key[size][size];
11 bool vis[size][size][1<<12];
12 struct node
13 {
14     int x , y , key , T; 
15     node(){};
16     node( int u , int v , int w , int p ):x(u),y(v),key(w),T(p){};    
17 };
18 queue<node> q;
19 
20 void init( )
21 {
22     memset( vis , false , sizeof(vis) );
23     memset( wall , -1 , sizeof(wall) );
24     memset( key , 0 , sizeof(key) );
25     while( !q.empty() )
26         q.pop();    
27 }
28 
29 int bfs( int x1 , int y1 , int x2 , int y2 )
30 {
31     node now;
32     q.push( node(x1,y1,key[x1][y1],0) );
33     vis[x1][y1][ key[x1][y1] ] = true;    
34     while( !q.empty() )
35     {
36         now = q.front();
37         q.pop();
38         if( now.x==x2 && now.y==y2 )
39             return now.T;
40         for( int i = 0 ; i<4 ; i++ )
41         {
42             int xx = now.x + dir[i][0];
43             int yy = now.y + dir[i][1];
44             if( xx>=1 && xx<=n && yy>=1 && yy<=m )
45             {
46                 int door = wall[xx][yy][now.x][now.y];
47                 int kk = now.key | key[xx][yy];
48                 if( !vis[xx][yy][kk] && ( door==-1 || ( door>=1 && ( (1<<door)&now.key )!=0 ) ) )
49                 {
50                     vis[xx][yy][kk] = true;
51                     q.push( node(xx,yy,kk,now.T+1) );
52                 }
53             }
54         }
55     }
56     return -1;
57 }
58 
59 int main()
60 {
61     int p , k , s , g , q , x1 , x2 , y1 , y2 , ans;
62     while( cin >> n >> m >> p )
63     {
64         cin >> k;
65         init();
66         while( k-- )
67         {
68             cin >> x1 >> y1 >> x2 >> y2 >> g;
69             wall[x1][y1][x2][y2] = wall[x2][y2][x1][y1] = g;
70         }
71         cin >> s;
72         while( s-- )
73         {
74             cin >> x1 >> y1 >> q;
75             key[x1][y1] |= (1<<q);
76         }
77         ans = bfs( 1 , 1 , n , m );
78         cout << ans << endl;
79     }
80     return 0;
81 }
View Code

 

再去做下 上次的 二分图 =_=

hdu--5093--状压bfs

标签:style   blog   http   io   color   ar   os   sp   for   

原文地址:http://www.cnblogs.com/radical/p/4100101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!