师傅又被妖怪抓走了

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述

话说唐僧复得了孙行者,师徒们一心同体,共诣西方。自宝象国救了公主,承君臣送出城西,沿路饥餐渴饮,悟空便为师傅去化斋,等悟空回来,悟净慌慌张张的对悟空说:“不好了,不好了”,还没等悟净说完,悟空说:“师傅又被妖怪抓走了”,悟净:“NO!” ,悟空一脸茫然,悟净:“师傅和二师兄都被妖怪抓走了”。悟空(晕!)。为了防止悟空救人,妖怪先把唐憎和八戒分别藏起来,如果悟空在T分钟之后还没找到人,那必定是被妖怪吃掉了。假设悟空在一个n行m列的矩阵内,悟空在每一分钟可以走到上,下,左,右的其中的一个可以走的位置,每次只能走一步。我们把发现定义为可以直接看到对方,也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方。

 
输入
有多组测试数据,每组首先是三个正整数n , m (3<=n,m<=100), T,(0<=T<=100) 分别代表行数,列数,规定的时间。接下来n 行,每行 m 个字符。其中’ S ’ 代表悟空的位置,’ D ’代表师傅位置,’ E ’代表八戒的位置。并且保证都只有一个. ’ X ’代表墙 ,’ . ’代表空地 .
输出
每组先输出一行Case c:(c表示当前的组数,从1开始计数);
接下来一行,如果悟空可以在规定时间内找到两人,则输出最少需要的时间,否则输出-1。
样例输入
5 6 3
XXD...
....E.
....X.
....S.
......
5 6 3
XDX...
....E.
......
....S.
......
5 6 8
XXDX..
.XEX..
......
....S.
......
样例输出
Case 1:
-1
Case 2:
3
Case 3:
-1 解题思路:首先将图处理一下,处理成可以表示在某点可以找到某人或两人。然后在搜到某人后搜另外一个或者同时搜到两人。如果搜到其中一人,然后再搜另外一人。这就是双广搜,先搜一个中间结果,再在这个基础上搜另外未完成的结果。但是需注意,不是先搜到的就是最优结果。所以需要把能成功搜到两人的路径都搜一遍。取最小值。
#include<bits/stdc++.h>
using namespace std;
char Map[105][105];
int mark[105][105];
int vis[105][105];
int f[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int n,m,ans,t;
const int INF=1e9;
struct Monkey{
int x,y;
int step;
};
bool CanTravle(int ti,int tj){ //判断是否可以走
if(Map[ti][tj]=='X'||Map[ti][tj]=='D'||Map[ti][tj]=='E'){
return 0;
}else{
return 1;
}
}
char trans(int i,int j,int cas){ //转化字符
if(cas&&Map[i][j]=='e'||(!cas&&Map[i][j]=='d')){
return 'o';
}
return cas ? 'd': 'e';
}
void Change(int si,int sj,int cas){ //把D、E所在的行列能走的变为d和e,把交叉点变为o
int i,j;
for(i=si+1;i<=n&&CanTravle(i,sj);i++)
Map[i][sj]=trans(i,sj,cas);
for(i=si-1;i>=1&&CanTravle(i,sj);i--)
Map[i][sj]=trans(i,sj,cas);
for(j=sj+1;j<=m&&CanTravle(si,j);j++)
Map[si][j]=trans(si,j,cas);
for(j=sj-1;j>=1&&CanTravle(si,j);j--)
Map[si][j]=trans(si,j,cas);
}
queue<Monkey>Q;
queue<Monkey>Qde;
int BFSde(int cas){ //在找到八戒或师父后找另外一个
Monkey st,tmp;
while(!Qde.empty()){
st=Qde.front();
Qde.pop();
if(st.step>t)
continue;
if(cas&&Map[st.x][st.y]=='e'||(!cas&&Map[st.x][st.y]=='d')||Map[st.x][st.y]=='o'){
return st.step;
}
int i,j,tx,ty,tsp;
for(i=0;i<4;i++){
tx=st.x+f[i][0];
ty=st.y+f[i][1];
if(tx<=n&&tx>=1&&ty<=m&&ty>=1&&(!vis[tx][ty])&&CanTravle(tx,ty)){
tsp=st.step+1;
vis[tx][ty]=1;
tmp.x=tx,tmp.y=ty,tmp.step=tsp;
Qde.push(tmp);
}
}
}
return INF;
}
void BFS(){ //找到八戒或师父或同时找到两人
Monkey st,tmp;
ans=INF;
while(!Q.empty()){
st=Q.front();
Q.pop();
if(st.step>t)
continue;
if(Map[st.x][st.y]=='o'){
ans=min(ans,st.step);
}else if(Map[st.x][st.y]=='e'){
while(!Qde.empty())
Qde.pop();
Qde.push(st);
memset(vis,0,sizeof(vis));
vis[st.x][st.y]=1;
ans=min(ans,BFSde(0));
}else if(Map[st.x][st.y]=='d'){
while(!Qde.empty())
Qde.pop();
Qde.push(st);
memset(vis,0,sizeof(vis));
vis[st.x][st.y]=1;
ans=min(ans,BFSde(1));
}
int tx,ty,tsp,i,j;
for(i=0;i<4;i++){
tx=st.x+f[i][0];
ty=st.y+f[i][1];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&CanTravle(tx,ty)&&(!mark[tx][ty])){
mark[tx][ty]=1;
tsp=st.step+1;
tmp.x=tx,tmp.y=ty,tmp.step=tsp;
Q.push(tmp);
}
}
}
}
int main(){
int i,j,k,cnt=0;
Monkey st;
while(scanf("%d%d%d",&n,&m,&t)!=EOF){
memset(mark,0,sizeof(mark));
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>Map[i][j];
if(Map[i][j]=='S'){
st.x=i;
st.y=j;
st.step=0;
}
}
}
for(i=1;i<=n;i++){ //处理图
for(j=1;j<=m;j++){
if(Map[i][j]=='D'){
Change(i,j,1);
}else if(Map[i][j]=='E'){
Change(i,j,0);
}
}
}
while(!Q.empty())
Q.pop();
Q.push(st);
mark[st.x][st.y]=1;
BFS();
if(ans>t){
printf("Case %d:\n-1\n",++cnt);
}else{
printf("Case %d:\n%d\n",++cnt,ans);
}
}
return 0;
} /* 5 6 30
XDX...
....E.
...S..
......
...... 7 6 5
......
.D.X..
X.X...
X.....
X.X...
.E....
...S..
*/

  


nyoj 999——师傅又被妖怪抓走了——————【双广搜】的更多相关文章

  1. nyoj999 师傅又被妖怪抓走了 (预处理+bfs+状态压缩)

    题目999 题目信息 执行结果 本题排行 讨论区 师傅又被妖怪抓走了 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝 ...

  2. NYOJ999 师傅又被妖怪抓走了

    只记得当下的眼疼 , ok 各种数据也试了 , 就是 他娘的不对 , 我也是醉了 . 也是日了最野的狗 附上日了哮天犬的代码 , 这个题 先放放, 一段时间后再试试 , 明天开始状态压缩吧 .为期两天 ...

  3. openjudge 大师兄,师傅被妖怪抓走啦

    描述 孙悟空听到沙僧大喊一句:“大师兄,师傅被妖怪抓走啦!”于是孙悟空直追白骨精而去.孙悟空在一条长度为L的森林小路上飞奔,上面有L+1个整点,依次为0,1,2……L.白骨精会使用一种大范围的攻击法术 ...

  4. nyoj 999

    nyoj 999: 点击打开题目链接 题目思路,处理一下地图,把 D E 能看到的地方标记一下.然后就是暴力广搜一下.标记状态,因为同样在同一个点,但是你刚出发到达那点和找到D之后到达相同的点和找到E ...

  5. shu_1548 悟空问题(大哥,主妖怪抓走的朋友!)

    http://202.121.199.212/JudgeOnline/problem.php?cid=1078&pid=17 分析:  直接暴力了.. . 代码: #include <s ...

  6. nyoj 613 免费馅饼 广搜

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

  7. nyoj 1022 最少步数【优先队列+广搜】

    最少步数 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 ...

  8. nyoj 592 spiral grid(广搜)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=592 解决以下问题后就方便用广搜解: 1.将数字坐标化,10000坐标为(0,0),这样就 ...

  9. nyoj 523 双向广搜

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=523 #include<iostream> #include<cstd ...

随机推荐

  1. JavaScript中function 之return false的理解(实例代码)

    1.司空见惯代码,在某一dom节点上注册事件方法 $("#btnResponse").click(Login); $("#txtCode").keydown(R ...

  2. 「BZOJ 2809」「APIO 2012」Dispatching「启发式合并」

    题意 给定一个\(1\)为根的树,每个点有\(c,w\)两个属性,你需要从某个点\(u\)子树里选择\(k\)个点,满足选出来的点\(\sum_{i=1}^k w(i)\leq m\),最大化\(k\ ...

  3. JSP标签的用法

    JSP动作标签: 通过动作标签,程序员可以在JSP页面中把页面的显示功能部分 封装起来,是整个页面更简洁和易于维护 <jsp:useBean> 装载一个将在JSP页面中使用的JavaBea ...

  4. linux下配置apache多站点访问-小案例

    一级域名(baidu.com)也叫作顶级域名,注册一级域名是需要付费的. 而二级域名(image.baidu.com)是一级域名的延伸,所以只要购买了一级域名,二级域名是可以任意配置的. 其实(www ...

  5. 50个php程序性能优化的方法,赶紧收藏吧!

    1. 用单引号代替双引号来包含字符串,这样做会更快一些.因为 PHP 会在双引号包围的 字符串中搜寻变量,单引号则不会,注意:只有 echo 能这么做,它是一种可以把多个字符 串当作参数的“函数”(译 ...

  6. 修剪草坪 单调队列优化dp BZOJ2442

    题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Farm John的草坪非 ...

  7. 【转】IntelliJ Idea取消Could not autowire. No beans of 'xxxx' type found的错误提示

    1.问题描述 在Idea的spring工程里,经常会遇到Could not autowire. No beans of 'xxxx' type found的错误提示.但程序的编译和运行都是没有问题的, ...

  8. P2763 试题库问题

    传送门 显然的网络流,源点向所有题目连流量为1的边,表示一题只能用一次,题目向它的所有类型连边,流量设为1,类型向汇点连边流量为题目需要的该类型的数量 然后最大流 如果最大流小于总需要的类型题目数量则 ...

  9. C# Task超时规则

    需要知道以下的知识 正规的骚操作:https://stackoverflow.com/questions/4238345/asynchronously-wait-for-taskt-to-comple ...

  10. 从source安装python3.5和pip

    按顺序来,先装上python3.5,source安装,命令是 ./configure --prefix="你想要的路径" make make install 然后是安装pip,但是 ...