HDU 5025 Saving Tang Monk(状态转移, 广搜)
#include<bits/stdc++.h>
using namespace std;
const int maxN = ;
const int inf = 1e9 + ;
char G[maxN][maxN], snake[maxN][maxN];
int times[maxN][maxN][];
int n, m, sx, sy, ex, ey, ans;
int dir[][] = {{,},{,},{,-},{-,}}; struct node
{
int x, y, t, key, killed; //坐标, 步数, 已经拿到的钥匙, 有没有杀蛇
bool operator < (const node& p) const
{
return t > p.t;
}
node(int x, int y, int t, int key, int killed):x(x),y(y), t(t), key(key), killed(killed) {};
};
void bfs()
{
node t = (node)
{
sx, sy, , ,
};
times[sx][sy][] = ;
queue<node> q;
q.push(t);
while(!q.empty())
{
node u = q.front();
q.pop();
int x = u.x, y = u.y, key = u.key, t = u.t, killed = u.killed;
if(x == ex && y == ey && key == m)
{
ans = min(ans, t);
continue;
}
for(int d = ; d < ; d++)
{
int tx = x + dir[d][];
int ty = y + dir[d][];
if(tx < || tx >= n || ty < || ty >= n || G[tx][ty] == '#') //越界
continue; if(G[tx][ty] >= '' && G[tx][ty] <= '') //如果是钥匙
{
int num = G[tx][ty] - '';
if(key + == num && (times[tx][ty][key + ] > t + )) //可以拿
{
q.push(node(tx,ty,t+,key+,killed));
times[tx][ty][key + ] = t + ;
}
else if(((key + ) != num) && (times[tx][ty][key] > t + )) //不可以拿
{
q.push(node(tx,ty,t+,key,killed));
times[tx][ty][key] = t + ;
}
}
else if(G[tx][ty] >= 'A' && G[tx][ty] <= 'E') //蛇
{
int cnt = G[tx][ty] - 'A'; //压位判断 if((killed & (<<cnt)) == ) //未杀
{
if(times[tx][ty][key] > t + )
{
q.push(node(tx,ty,t+,key,(killed | (<<cnt))));
times[tx][ty][key] = t + ;
}
}
else //已经杀了
{
if(times[tx][ty][key] > t + )
{
q.push(node(tx,ty,t+,key,killed));
times[tx][ty][key] = t + ;
}
}
}
else if((G[tx][ty] == '.' || G[tx][ty] == 'T' || G[tx][ty] == 'K') && times[tx][ty][key] > t + )
{
q.push(node(tx,ty,t+,key,killed));
times[tx][ty][key] = t + ;
}
}
}
}
int main()
{
// freopen("1.txt","r", stdin);
while(~scanf("%d %d", &n, &m))
{
int cnt = ;
if(n == )
break;
for(int i = ; i < n; i++)
for(int j = ; j < n; j++)
for(int k = ; k < ; k++)
times[i][j][k] = inf;
for(int i = ; i < n; i++)
{
scanf("%s", G[i]);
}
for(int i = ; i < n; i++)
{
for(int j = ; j < n; j++)
{
if(G[i][j] == 'K')
sx = i, sy = j;
if(G[i][j] == 'T')
ex = i, ey = j;
if(G[i][j] == 'S')
{
G[i][j] = (cnt++ + 'A');
}
}
} ans = inf;
bfs();
if(ans == inf)
{
printf("impossible\n");
}
else
{
printf("%d\n", ans);
}
}
return ;
}
HDU 5025 Saving Tang Monk(状态转移, 广搜)的更多相关文章
- hdu 5025 Saving Tang Monk 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...
- HDU 5025 Saving Tang Monk 【状态压缩BFS】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Time Limit: 2000/1000 MS (Java/O ...
- [ACM] HDU 5025 Saving Tang Monk (状态压缩,BFS)
Saving Tang Monk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- hdu 5025 Saving Tang Monk(bfs+状态压缩)
Description <Journey to the West>(also <Monkey>) is one of the Four Great Classical Nove ...
- HDU 5025 Saving Tang Monk
Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ...
- ACM学习历程—HDU 5025 Saving Tang Monk(广州赛区网赛)(bfs)
Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ...
- 2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)
/* 这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态! 以前做过的都是用二维的!自己的四维还是太狭隘了..... 题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到! 每种钥匙有 k ...
- HDU 5025 Saving Tang Monk --BFS
题意:给一个地图,孙悟空(K)救唐僧(T),地图中'S'表示蛇,第一次到这要杀死蛇(蛇最多5条),多花费一分钟,'1'~'m'表示m个钥匙(m<=9),孙悟空要依次拿到这m个钥匙,然后才能去救唐 ...
- HDU 5025:Saving Tang Monk(BFS + 状压)
http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description <Journey to ...
随机推荐
- 2.语言概述-JavaScript权威指南笔记
上周三的时候交给老板目前的项目第一个迭代回顾会的总结.原本是以综述性的表述方式写的,交给他之后表示程序员不要长篇大论.总结要分为优点缺点期望等等块,每块列出条目,简明扼要的表达出来.这里也用这种风格. ...
- WebStorm快捷键(Mac版)
编辑 Command+alt+T 用 (if..else, try..catch, for, etc.)包住 Command+/ 注释/取消注释的行注释 Command+alt+/ 注释/取消注释与块 ...
- js浮点数计算(加,减)
最近工作中经常遇到需要处理浮点型计算的问题,开始一直都在用把浮点数先乘以10的对应小数的位数的次方化成整数再去开始计算. 例如100.01+100.02,可以化成(100.01*100+100.02* ...
- 参考消息 Android 读报
<参考消息>是新华通讯社主办,参考消息报社编辑出版的日报,创刊于1931年,历史长达80年.<参考消息>每天及时选载世界各国(地区)通讯社.报刊及因特网上的最新消息.评论的精华 ...
- 一步一步教你玩转.NET Framework的配置文件app.config
转自https://www.cnblogs.com/tonnie/archive/2010/12/17/appconfig.html 在一般的项目中,为了使你的代码更加灵活,更方便调整,减少不必要的h ...
- 从程序猿到SAP产品经理,我是如何转型的?
文章作者:Jason Xia(夏建军) Jerry: 今天的文章来自Jason Xia, 我的老同事,和我一样从2007年进入SAP成都研究院工作至今.这篇文章讲述了Jason是如何从一名SAP资深开 ...
- JAVA小游戏之两个物体碰撞产生的碰撞检测
首先必须了解两个物体,在移动时,会有怎样的效果,比如沪我们小时候耍过的坦克大战.看起来很简单,但是写起代码来,复杂的要多: 下面举个例子: // 构造一个新的 Rectangle,其左上角的坐标为 ( ...
- Wannafly Union Goodbye 2016-A//初识随机化~
想来想去还是把这个题写下来了.自己在补题遇到了许多问题. 给出n(n<=1e5)个点,求是否存在多于p(p>=20)×n/100的点在一条直线上... 时限20s,多组数据,暴力至少n^2 ...
- 团队作业——项目Alpha版本发布
---恢复内容开始--- https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1 https://edu.cnblogs.com ...
- 原型模式 -- JavaScript语言的灵魂
原型模式就是将原型对象指向创建对象的类,使这些类共享原型对象的方法与属性.JS是基于原型链实现对象之间的继承,是对属性或者方法的共享,而不是对属性和方法的复制. // 图片轮播类 var LoopIm ...