HDU-3085 Nightmare Ⅱ

题目:

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

题意:

M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是MG先走M能走3步,G能走1步,Z每次向边上2步内变出分身。求所需最短时间。

思路:

从M、G双向广搜即可,注意人和鬼不是同时移动,而且一次能向外搜很多步,所以每轮广搜都要读取之前一轮的数据,分不同队列处理比较好。

注意鬼能穿墙,所以判断的时候只要计算与两个鬼的曼哈顿距离即可。

代码:

#define N 1123
int n,m;
int step,res,ans;
char g[N][N];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
struct node
{
    int x,y;
}tn,gg,mm,zz[2];
queueq[2],qt;
bool judge(node t)
{
    for(int i=0;i<2;i++)
        if(abs(t.x-zz[i].x)+abs(t.y-zz[i].y)<=2*step||g[t.x][t.y]=='X'||g[t.x][t.y]=='\0')
            return false;
    return true;
}
bool bfs(int mark,int num,char start,char endd)
{
    node a,b;
    qt=q[mark];
    for(int i=0;i




你可能感兴趣的:(搜索)