博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)
阅读量:5906 次
发布时间:2019-06-19

本文共 2274 字,大约阅读时间需要 7 分钟。

/*    这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态!    以前做过的都是用二维的!自己的四维还是太狭隘了.....        题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到!    每种钥匙有 k 种, 每一种有多个! 只要求找到每一种的其中一个就可以!    找钥匙的顺序按照 第1种, 第2种, 第3种 ....第k种!     找钥匙的时间是一步, 走到相邻空地的时间是一步, 打蛇的时间就是两步!    求找到师傅的最少步数!         这里说一下 state[N][N][10][35]表示的含义: ->state[x][y][i][j]     前两维就不用说了,就是地图上的坐标, 第三维表示的是当前找到第几把钥匙    第四维表示的沿着一条路径走到 (x, y)找到 第 i 把钥匙打掉了哪几条蛇!    将 j 拆分成 二进制, 从右往左数, 如果第 k 为是1, 表示第 k 条 蛇杀掉了! */ #include
#include
#include
#include
#include
#define N 105using namespace std;char mp[105][105];bool state[N][N][10][35];int bx, by;struct node{ int x, y; int numk, snk; int step; node(){} node(int x, int y, int numk, int snk, int step){ this->x = x; this->y = y; this->numk = numk; this->snk = snk; this->step = step; }};int n, m;int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};bool operator < (node a, node b) { return a.step > b.step;}priority_queue
q;bool bfs(){ while(!q.empty()) q.pop(); memset(state, false, sizeof(state)); q.push( node(bx, by, 0, 0, 0) ); state[bx][by][0][0] = true; while( !q.empty() ) { node cur = q.top(); q.pop(); for(int i=0; i<4; ++i){ int x = cur.x + dir[i][0]; int y = cur.y + dir[i][1]; if(x<1 || x>n || y<1 || y>n || mp[x][y]=='#') continue; int numk = cur.numk, snk = cur.snk, step = cur.step; if(mp[x][y] == '.') step += 1; else if( mp[x][y] >= '1' && mp[x][y] <= '9'){ if( numk + 1 == mp[x][y] - '0' ) numk += 1; step += 1; } else if( mp[x][y] >= 'A' && mp[x][y] <= 'E' ){//这一步是关键 int cnt = mp[x][y] - 'A' + 1; if( (1 << (cnt-1) ) & snk ) step += 1;//如果这一条蛇已经被打过了,也就是一条路又折回到这一个点 else{//在这一条路上,这条蛇没有被打过,那就将它打掉,并标记这条蛇打过了! step += 2; snk ^= ( 1 << (cnt-1) ); } } else if( mp[x][y] == 'T' && numk == m ){ printf("%d\n", step + 1); return true; } else step += 1; if( state[x][y][numk][snk] ) continue; state[x][y][numk][snk] = true; q.push( node(x, y, numk, snk, step) ); } } return false;}int main(){ while( scanf("%d%d", &n, &m) && (n ||m) ) { int cntS = 0; for(int i = 1; i <= n; ++ i){ scanf("%s", mp[i] + 1); for(int j = 1; j <=n; ++ j) if(mp[i][j] == 'K'){ bx = i; by = j; } else if(mp[i][j] == 'S') mp[i][j] = 'A' + cntS++; } if( !bfs() ) printf("impossible\n"); } return 0;}

转载地址:http://dejpx.baihongyu.com/

你可能感兴趣的文章
前后端JSON数据传递对象包含对象处理
查看>>
敏捷个人2012.5月份户外活动报道:0费用京郊经典户外路线【京西古道】
查看>>
网站运营服务商选择
查看>>
javascript split函数讲解
查看>>
模拟redolog损坏,删除损坏并添加新的redolog
查看>>
Parallels安装Kali2.0遇到的问题及解决办法
查看>>
JAVA死锁和避免死锁
查看>>
我的友情链接
查看>>
使用FileSystem API读取数据
查看>>
Jboss4集群配置之一:前言与集群知识
查看>>
Objective-C内存管理和原理
查看>>
角点检测(1)Moravec's 算子
查看>>
Adapter之BaseAdapter使用
查看>>
CMDB项目之监控模板template设计
查看>>
linux动态库路径配置
查看>>
map这个小妖精(*/ω\*)
查看>>
Java 9,OSGi以及模块化的未来
查看>>
Android笔记:onSaveInstanceState和onRestoreInstanceState总结
查看>>
Apache 配置HTTPS协议搭载SSL配置
查看>>
远程访问×××-Easy ×××-router
查看>>