hdu 1429 胜利大逃亡(续)
2015-10-02 20:44
381 查看
刚开始不知道有状态压缩,定义了一个这样的结构体
数组a用来存放钥匙,然后代码写出来,MLE了。
遂查题解。知道了要用状态压缩,于是去学。
就是定义一个三维数组,第三维存储在某种状态下,是否走过map[x][y]位置。
某种状态可以这样定义:若钥匙种类不变即为相同状态,地图上每个位置相同状态只能经过一次。
可以用二进制表示是否有某种要是。
比如0000100000即表示为含有f钥匙。结合位运算,即可得出答案。
http://blog.csdn.net/yuhailin060/article/details/5482998
struct node() { int x,y; int a[10]; int step; };
数组a用来存放钥匙,然后代码写出来,MLE了。
遂查题解。知道了要用状态压缩,于是去学。
就是定义一个三维数组,第三维存储在某种状态下,是否走过map[x][y]位置。
某种状态可以这样定义:若钥匙种类不变即为相同状态,地图上每个位置相同状态只能经过一次。
可以用二进制表示是否有某种要是。
比如0000100000即表示为含有f钥匙。结合位运算,即可得出答案。
http://blog.csdn.net/yuhailin060/article/details/5482998
#include<iostream> #include<cstdio> #include<queue> using namespace std; const int N=25; #define MM(a) memset(a,NULL,sizeof(a)); int n,m,t; int map ; struct node { int x,y,step; int key; bool Logic() { if(x>=1&&y>=1&&x<=n&&y<=m&&map[x][y]!='*') return true; return false; } }start,cur,now; int vis [1050]; int dir[4][2]={1,0,-1,0,0,-1,0,1}; queue<node> q; int bfs() { while(!q.empty()) { cur=q.front(); q.pop(); if(t<=cur.step) break; if(map[cur.x][cur.y]=='^') return cur.step; for(int i=0;i<4;i++) { now=cur; now.x+=dir[i][0]; now.y+=dir[i][1]; now.step++; //cout<<now.x<<" "<<now.y<<endl; if(now.Logic()) { if(map[now.x][now.y]>='A'&&map[now.x][now.y]<='J') { int key=(map[now.x][now.y]-'A'); if((now.key>>key)&1&&!vis[now.x][now.y][now.key]) { vis[now.x][now.y][now.key]=true; q.push(now); //cout<<now.x<<" "<<now.y<<endl; } } else if(map[now.x][now.y]>='a'&&map[now.x][now.y]<='j') { int key=(1<<(map[now.x][now.y]-'a')); now.key=(now.key|key); if(!vis[now.x][now.y][now.key]) { vis[now.x][now.y][now.key]=true; q.push(now); //cout<<now.x<<" "<<now.y<<endl; } } else { if(!vis[now.x][now.y][now.key]) { vis[now.x][now.y][now.key]=true; q.push(now); //cout<<now.x<<" "<<now.y<<endl; } } } } } return -1; } int main() { //freopen("in.txt","r",stdin); while(cin>>n>>m>>t) { getchar(); MM(vis); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='@') { start.x=i; start.y=j; } } getchar(); } while(!q.empty()) q.pop(); start.step=0; start.key=0; q.push(start); cout<<bfs()<<endl; } }
相关文章推荐
- C#使用DeflateStream解压缩数据文件的方法
- C#调用WinRar执行rar、zip压缩的方法
- C#实现页面GZip或Deflate压缩的方法
- C#使用iCSharpcode进行文件压缩实现方法
- C#实现压缩HTML代码的方法
- Asp.net在线备份、压缩和修复Access数据库示例代码
- 使用UglifyJS合并/压缩JavaScript的方法
- 高性能WEB开发 JS、CSS的合并、压缩、缓存管理
- 脚本分析、压缩、混淆工具 JSA新版本发布,压缩效率提高大约10%
- 发布一个高效的JavaScript分析、压缩工具 JavaScript Analyser
- PHP实现图片压缩的两则实例
- 在IIS上启用Gzip压缩 (HTTP压缩)第1/3页
- javascript实现的样式表(CSS) 格式整理与压缩
- php zlib压缩和解压缩swf文件的代码
- YUI Compressor压缩JavaScript原理及微优化
- Nginx中的Gzip压缩配置介绍
- python zip文件 压缩
- Tomcat配置gzip压缩提高浏览网站的速度
- C#实现的文件压缩和解压缩类
- CSS代码格式化和压缩的方法与技巧