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 ...
随机推荐
- 转 v$session_longops视图
转http://www.dbdream.com.cn/2013/10/14/vsession_longops%E8%A7%86%E5%9B%BE/ 1.有的时候不准确 ,我看到 session wai ...
- 类成员函数的重载、覆盖和隐藏区别 (C++)
这是本人第一次写博客,主要是想记录自己的学习过程.心得体会,一是可以方便以后回顾相关知识,二是可以与大家相互学习交流. 关于C++中类成员函数的重载.覆盖和隐藏区别,第一次看到这个问题是在准备找工作的 ...
- SQLServer数据库表字段超长,找到超长字段脚本
平时开发系统时偶尔会遇到数据超长导致往数据库中保存时出错. 使用下边的脚本可以方便的找出超长的字段. 1.通过正式表创建临时表,修改临时表中varchar.nvarchar的长度为max ); ); ...
- java jmap
jmap : 命令用于生成堆转储快照.它还可以查询finalize执行队列.Java堆和永久代的详细信息,如空间使用率.当前用的是哪种收集器等. 命令格式: jmap [option] vmid op ...
- python-day1作业(感谢视频老师留的作业)
__author__ = 'zht' #!/usr/bin/env python # -*- coding: utf-8 -*- ''' #努力学习每一天 ''' #尝试次数计数器 tries = 0 ...
- Vue的computed和methods区别
1,computed里面定义的方法是以属性的方式(当然也可以以函数调用的方式)出现在html里面,而methods里面定义的方法是以函数的方式: 2,computed依赖于data里面的数据,只有相关 ...
- mysqldatadir 转移
当mysql data路径与原始目录不一致时 ,请在mysql 安装目录下my-default.ini 进行设置,取消对应#注释的地址,设置新地址,保存,重新启动,即可. 从网上各种搜索啊,各种尝试, ...
- CRC检错技术原理
一.题外话 说来惭愧,一开始是考虑写关于CRC检错技术更深层次数学原理的,然而在翻看<Basic Algebra>后,我果断放弃了这种不切实际的想法.个人觉得不是因为本人数学水平差或者能力 ...
- Jenkins上svn更新策略说明
- SqlServer中生成一串连续数字
在SQLServer中一串连续数字,如1,2,3,4,5,....或者 1 2 3 4 5 没有现成方法,网上都用通用表表达式递归生成.今天想到一个还算简单的方法,记录下来: select row_n ...