hdu1885 状压搜索 板子
2016-03-15 20:08
295 查看
// hdu 1885 状压搜索入门 // // 题目意思很简单,四种钥匙四种门,在状态里面 // 加入钥匙的二进制压缩,输出答案,就好了... // 记一下板子 #include <cstdio> #include <cmath> #include <map> #include <queue> #include <iostream> #include <vector> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int MAX_N = 109; const int MOD = 1e9 + 7; const double PI = acos(-1); int n,m; bool vis[MAX_N][MAX_N][20]; const int dx[4] = { -1,0,1,0 }; const int dy[4] = { 0,1,0,-1 }; char g[MAX_N][MAX_N]; struct Point{ int x; int y; int key; int ans; Point(){ } Point(int x,int y,int key,int ans):x(x),y(y),key(key),ans(ans){ } }; void print(){ printf("The poor student is trapped!\n"); } int sx,sy; bool in(int x,int y){ if (x >= 1 && x <= n && y >=1 && y <= m) return true; return false; } int idx(char c){ switch(c){ case 'B': case 'b': return 0; case 'Y': case 'y': return 1; case 'R': case 'r': return 2; case 'G': case 'g': return 3; } } void bfs(){ queue<Point> que; Point u; u.x = sx; u.y = sy; u.key = 0; u.ans = 0; que.push(u); vis[sx][sy][0] = 1; int st = 0; int k = 0; while(!que.empty()){ u = que.front(); que.pop(); for (int i = 0 ;i < 4;i ++){ int tx = u.x + dx[i]; int ty = u.y + dy[i]; if (!in(tx,ty)) continue; if (g[tx][ty] == '#') continue; if(g[tx][ty] == 'X'){ printf("Escape possible in %d steps.\n",u.ans+1); return ; } st = u.key; k = idx(g[tx][ty]); if(g[tx][ty] >= 'A' && g[tx][ty] <= 'Z'){ if (st & (1 << k) && !vis[tx][ty][st]){ vis[tx][ty][st] = 1; que.push(Point(tx,ty,st,u.ans + 1)); } } else if (g[tx][ty] >= 'a' && g[tx][ty] <= 'z'){ st |= (1 << k); if (vis[tx][ty][st]) continue; vis[tx][ty][st] = 1; que.push(Point(tx,ty,st,u.ans + 1)); }else { if (!vis[tx][ty][st]){ vis[tx][ty][st] = 1; que.push(Point(tx,ty,st,u.ans+1)); } } } } print(); } void input(){ for (int i = 1;i <= n;i ++) scanf("%s",g[i] + 1); memset(vis,0,sizeof(vis)); for (int i = 1;i <= n;i ++){ for (int j = 1;j <= m;j ++){ if (g[i][j] == '*'){ sx = i; sy = j; break; } } } //print(); bfs(); } int main(){ //freopen("te.txt","r",stdin); while(scanf("%d%d",&n,&m)!=EOF && n && m){ input(); } return 0; }
相关文章推荐
- 解决GridView嵌套到ListView里只显示一行
- C++中四种类型转换方式
- dijkstra算法实现
- 第3周项目2 本月有几天
- iOS常见错误9-UITableView,UIScrollView,UICollectionView偏移20像素
- Linux资源控制-CPU和内存【转】
- cron crontab anacron anacrontab Linux下的计划任务
- Type 3字体的解决办法
- 怒刷蓝桥杯
- POJ 2299 线段树/树状数组求逆序数
- Java ThreadLocal
- 进程和线程的区别以及联系
- 使用TableLayout
- Code Review的重要性
- 操作系统项目(一)安装qemu
- iOS中的事件传递和响应者链条
- 进程学习——父进程子进程ID
- GCD应用及其他方法
- gulp使用笔记
- #import、#include、#import<>和#import””的区别