首页 > 代码库 > hdu--5093--状压bfs
hdu--5093--状压bfs
主要就是开个 三维vis数组 第三维 表示在<x,y>坐标下的 钥匙有哪些
还有要注意的话 就是wall数组 是有3种不同的情况 -1 直接行走 0 墙 >=1 大门 需要钥匙
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 node13 {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 }
再去做下 上次的 二分图 =_=
hdu--5093--状压bfs
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。