【题目链接】

http://acm.hdu.edu.cn/showproblem.php?pid=3085

【算法】

双向BFS

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 810 const int dx[] = {,,-,};
const int dy[] = {-,,,}; int i,n,m,px,py,qx,qy,T;
char mp[MAXN][MAXN];
bool visited1[MAXN][MAXN];
bool visited2[MAXN][MAXN]; inline bool valid(int x,int y,int k)
{
if (x <= || x > n || y <= || y > m) return false;
if (abs(x - px) + abs(y - py) <= * k) return false;
if (abs(x - qx) + abs(y - qy) <= * k) return false;
if (mp[x][y] == 'X') return false;
return true;
}
inline int bfs()
{
int i,j,step,bx,by,gx,gy,tx,ty,s;
queue< pair<int,int> > q1,q2;
pair<int,int> cur;
px = py = qx = qy = ;
for (i = ; i <= n; i++)
{
for (j = ; j <= m; j++)
{
if (mp[i][j] == 'M')
{
bx = i;
by = j;
}
if (mp[i][j] == 'G')
{
gx = i;
gy = j;
}
if (mp[i][j] == 'Z')
{
if (!px)
{
px = i;
py = j;
} else
{
qx = i;
qy = j;
}
}
}
}
step = ;
while (!q1.empty()) q1.pop();
while (!q2.empty()) q2.pop();
memset(visited1,false,sizeof(visited1));
memset(visited2,false,sizeof(visited2));
visited1[bx][by] = true;
visited2[gx][gy] = true;
q1.push(make_pair(bx,by));
q2.push(make_pair(gx,gy));
while ((!q1.empty()) || (!q2.empty()))
{
step++;
s = q1.size();
for (i = ; i <= s; i++)
{
cur = q1.front();
q1.pop();
if (!valid(cur.first,cur.second,step)) continue;
for (j = ; j < ; j++)
{
tx = cur.first + dx[j];
ty = cur.second + dy[j];
if (valid(tx,ty,step) && !visited1[tx][ty])
{
if (visited2[tx][ty]) return step;
visited1[tx][ty] = true;
q1.push(make_pair(tx,ty));
}
}
}
s = q1.size();
for (i = ; i <= s; i++)
{
cur = q1.front();
q1.pop();
if (!valid(cur.first,cur.second,step)) continue;
for (j = ; j < ; j++)
{
tx = cur.first + dx[j];
ty = cur.second + dy[j];
if (valid(tx,ty,step) && !visited1[tx][ty])
{
if (visited2[tx][ty]) return step;
visited1[tx][ty] = true;
q1.push(make_pair(tx,ty));
}
}
}
s = q1.size();
for (i = ; i <= s; i++)
{
cur = q1.front();
q1.pop();
if (!valid(cur.first,cur.second,step)) continue;
for (j = ; j < ; j++)
{
tx = cur.first + dx[j];
ty = cur.second + dy[j];
if (valid(tx,ty,step) && !visited1[tx][ty])
{
if (visited2[tx][ty]) return step;
visited1[tx][ty] = true;
q1.push(make_pair(tx,ty));
}
}
}
s = q2.size();
for (i = ; i <= s; i++)
{
cur = q2.front();
q2.pop();
if (!valid(cur.first,cur.second,step)) continue;
for (j = ; j < ; j++)
{
tx = cur.first + dx[j];
ty = cur.second + dy[j];
if (valid(tx,ty,step) && !visited2[tx][ty])
{
if (visited1[tx][ty]) return step;
visited2[tx][ty] = true;
q2.push(make_pair(tx,ty));
}
}
}
}
return -;
} int main()
{ scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&m);
for (i = ; i <= n; i++) scanf("%s",mp[i]+);
printf("%d\n",bfs());
} return ; }

【HDU 3085】 Nightmare Ⅱ的更多相关文章

  1. 【HDU - 3085】Nightmare Ⅱ(bfs)

    -->Nightmare Ⅱ 原题太复杂,直接简单的讲中文吧 Descriptions: X表示墙 .表示路 M,G表示两个人 Z表示鬼 M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是M和G ...

  2. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  3. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  4. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  5. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  6. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  7. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  8. 【hdu 1043】Eight

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...

  9. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

随机推荐

  1. mysql命令行导出数据

    1. 包含表头 mysql -h${1} -P${2} -u${3} -p${4} -Dpom_${5} --default-character-set=utf8 -B -e > result. ...

  2. C# 设定时间内自动关闭提示框

    通过程序来自动关闭这个消息对话框而不是由用户点击确认按钮来关闭.然而.Net framework 没有为我们提供自动关闭MessageBox 的方法,要实现这个功能,我们需要使用Window API ...

  3. 如何在mac里面,把xcode代码同步到 tfs 的 git库(克隆git篇)

    如果是新的git库,还没有任何内容可以克隆,可以参考:http://www.cnblogs.com/IWings/p/6755795.html 在mac安装visual studio code htt ...

  4. Servlet+JSP(三):第一个Web程序

    Servlet+JSP(三):第一个Web程序在学习了服务器并成功安装后,我们知道当浏览器发送请求给服务器后,服务器会调用并执行对应的逻辑代码进行请求处理.逻辑代 码是由程序员自己编写然后放进服务器进 ...

  5. Promise嵌套问题/async await执行顺序

    /* 原则: 执行完当前promise, 会把紧挨着的then放入microtask队尾, 链后面的第二个then暂不处理分析, */ 一. new Promise((resolve, reject) ...

  6. cin输入过慢用scanf???现在才知道cin可以加速

    今天才发现可以加速原帖 只需要两行放在main开头即可 ios_base::sync_with_stdio(0); cin.tie(NULL);

  7. TCP/IP UDP 协议首部及数据进入协议栈封装的过程

    数据的封装 UDP 封装 TCP 封装 IP 封装 检验和算法 当应用程序用TCP传送数据时,数据被传送入协议栈中,然后逐一通过每一层直到被当作一串比特流送入网络 注: UDP数据TCP数据基本一致. ...

  8. C#学习笔记_10_设计模式&继承&多态

    10_设计模式&继承&多态 设计模式 由前人总结的用来解决特定问题的解决方案 单例模式 在一个项目的不同模块中获取对象,获取到的是同一个对象 代码 继承 概念:如果多个类中具有相同的字 ...

  9. 第八节:pandas字符串

    Pandas提供了一组字符串函数,可以方便地对字符串数据进行操作.

  10. 【Codeforces 63C】Bulls and Cows

    [链接] 我是链接,点我呀:) [题意] 给你一个长度为4的数字序列(每个数字都在0~9之间,且不重复出现) 现在让你猜这个长度为4的序列是什么. 猜了之后对方会告诉有几个数字是位置和数字都正确的(猜 ...