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 ...
随机推荐
- python 遇到的一些问题和解决方法
安装crypto python3里面这个改成了pycryptodome 1. pip3 install pycryptodome 或者 pip3 install -i https://pypi.do ...
- Oracle中文乱码,字符集问题处理
1. 右键计算机,选择属性,增加环境变量 NLS_LANG:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 2.进入注册表,依次单击HKEY_LOCAL_MACHINE --> ...
- Model中的验证规则
一.能够使用Model的Attribute进行服务端数据验证 本文目录 一.概述 二.MVC提供的常用上下文 三.自定义正则表达式验证 一.概述 为了确保数据的安全性,由Client发送到服务端的每一 ...
- Java基础语法(Eclipse)
Java基础语法 今日内容介绍 u Eclipse开发工具 u 超市库存管理系统 第1章 Eclipse开发工具 Eclipse是功能强大Java集成开发工具.它可以极大地提升我们的开发效率.可以自动 ...
- Rest_framework之版本控制、响应器和分页器
一.访问频率补充 频率: 自定义: 1 定义一个类MyThrottles allow_request(频率限制的逻辑) ==>这两个函数都是派生出来的,继承的类里面封装的. wait(返回一个数 ...
- When you want to give up, remember why you started.
When you want to give up, remember why you started.当你想要放弃的时候,请记住当初你为何而开始.
- ubuntu 12.04 source.list 源更新
官方源: #deb cdrom:[Ubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120423)]/ precise main restri ...
- countUp 动画展示数字变化
html <p id="countUp" style="font-size:25px;height:25px;background-color:#0aa;" ...
- python之元组,列表和字典的区别
Python语言包含6种内建的序列,其中,有两种主要的类型:列表和元组. 列表是可以修改的,而元组不可以,如果要添加或者删除某些元素,就只能用列表,为了限制某些元素,就会用到元组.一般来说,列表可以替 ...
- Html style="visibility:hidden"与style="display:none"的区别
style="visibility:hidden": 使对象在网页上隐藏,但该对象在网页上所占的空间没有改变. style="display:none": 使对 ...