【HDU 3085】 Nightmare Ⅱ
【题目链接】
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 Ⅱ的更多相关文章
- 【HDU - 3085】Nightmare Ⅱ(bfs)
-->Nightmare Ⅱ 原题太复杂,直接简单的讲中文吧 Descriptions: X表示墙 .表示路 M,G表示两个人 Z表示鬼 M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是M和G ...
- 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
- 【HDU 5647】DZY Loves Connecting(树DP)
pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- 【HDU 2196】 Computer(树的直径)
[HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...
- 【HDU 2196】 Computer (树形DP)
[HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...
- 【HDU 5145】 NPY and girls(组合+莫队)
pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...
- 【hdu 1043】Eight
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...
- 【HDU 3068】 最长回文
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...
随机推荐
- CSS——样式初始化
腾讯: body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select{margin:0;p ...
- 如何快速获取yun2win app key?
注册yun2win开发者账号 1.在注册页面输入您的邮箱,点击下方发送,yun2win将会发送一封验证邮件到您的邮箱: 2.如果没有收到邮件请查看垃圾箱或者点击重新发送: 3.打开邮箱查看验证邮件,点 ...
- 计组_IEEE754_练习题
IEEE754 阶码:移码:尾数:原码 一个规格化的32位浮点数x的真值可表示为: x=(-1)^s×(1. M) × 2^(E-127) e=E-127 其中尾数域 ...
- VM虚拟机NAT链接外网
1.vi /etc/sysconfig/networkNETWORKING=yesHOSTNAME=localhost.localdomainGATEWAY=192.168.110.2 2.vi /e ...
- profiler-gpu分析记录
查看 Android 手机芯片信息下面以 夜神模拟器为例 D:\cmderλ adb devices # 1. 列出安卓设备List of devices attached127.0.0.1:6200 ...
- resize监听div的size变化
具体实现分两类, ie9-10 默认支持div的resize事件,可以直接通过div.attachEvent('onresize', handler);的方式实现 其它浏览器 通过在div中添加一个内 ...
- 通过javascript在iframe中加载html
在spring mvc中,虽然有时候,在控制器中设置返回值是json对象,但在拦截器出现错误的时候,仍然可能返回html(根据设置的不同),如果要展示这些html,最好把他们放入iframe中,以防这 ...
- BFS入门篇——RQNOJ195&&335
PID195 / 校园迷宫☆ 从x,y走到去q,w的最小步数,限制是有的点可走,有的点不可走,BFS嘛. #include<bits/stdc++.h> using namespace s ...
- cmake更新版本简记
问题描述: 由于需求,要在服务器上安装ANTs(Advanced Normalization Tools).然而最新版的ANTs需要下载源码并用cmake编译, 于是根据https://github. ...
- zoj 3693
#include<stdio.h> #include<string.h>//进位问题如3.985 应该进位3.99 int main() { int n,k,i; ...