UESTC 解救小Q

来源:互联网 发布:技术导航源码 编辑:程序博客网 时间:2024/04/29 20:22

小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她。 迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫 里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到 传送阵的另一头。

现在请你帮助love8909算一算,他至少需要走多少步才能解 救到小Q?

Input

第一行为一个整数T,表示测试数据组数。

每组测试数据第一行为两个整数NM,(1N,M50)表示 迷宫的长和宽。

接下来有N行,每行M个字符,是迷宫的具体描述。

  • .表示安全的位置
  • #表示陷阱,
  • Q表示小Q的位置
  • L表示love8909所在位置,

数据保证love8909只有一个,数据也保证小Q只有一个。

小写字母a-z表示分别表示不同的传送阵,数据保证传送阵 两两配对。

Output

每组数据输出一行,解救小Q所需的最少步数,如果无论如何都 无法救小Q,输出-1

Sample input and output

Sample InputSample Output
25 5....L.###.b#b#a##.##...Qa5 5....L.###..#.#.##.##...Q.
3-1
注意一点:传送带走过后还可以走回来

15 5...#L.#.#a.#a#Q.###......

答案应为4

没有优化的代码
#include<stdio.h>#include<iostream>#include <queue>#include <string.h>using namespace std;int n,m;char map[60][60];int s_i,s_y,e_i,e_y;struct node{    int x,y;    int time;     node(int i,int j,int w):x(i),y(j),time(w)    {}    bool operator<(const node &t)const    {        return time>t.time;    }};int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};  //下,左 右,上bool vis[60][60];bool judge(int x,int y){   if(!vis[x][y] && x>=0 && x<n && y>=0 && y<m && map[x][y]!='#')   {       return true;   }    return false;}bool judeg2(int x,int y,int i ,int j)  //判断坐标(x,y)(i,j)是否一致{    if(x==i && y==j)    {        return false;    }    return true;}int bfs(){    priority_queue<node>q;    node h(s_i,s_y,0);    q.push(h);    vis[s_i][s_y]=true;    while (!q.empty())    {        h=q.top();        q.pop();        if(h.x==e_i && h.y==e_y)        {            return h.time;        }        for (int i=0; i<4; i++)        {            if(judge(h.x+dir[i][0], h.y+dir[i][1]))            {                node t(h.x+dir[i][0],h.y+dir[i][1],h.time+1);                if(map[t.x][t.y]>='a' && map[t.x][t.y]<='z')                {                    bool flag=false;                    for (int j=0; j<n; j++)   //遍历找传送出口  这种情况不能标记                    {                        for (int k=0; k<m; k++)                        {                            if(judeg2(j,k,t.x,t.y) && map[j][k]==map[t.x][t.y])                            {                                t.x=j;                                t.y=k;                                flag=true;                                break;                            }                        }                        if (flag)                        {                            break;                        }                    }                }                else                {                    vis[t.x][t.y]=true;                }                q.push(t);            }        }            }    return -1;}int main(){    int t;    scanf("%d",&t);        while (t--)    {        scanf("%d%d",&n,&m);        memset(vis, false, sizeof(vis));        for (int i=0; i<n; i++)        {            scanf("%s",map[i]);        }                for (int i=0; i<n; i++)        {            for(int j=0;j<m;j++)            {                if(map[i][j]=='L')                {                    s_i=i;                    s_y=j;                }                if(map[i][j]=='Q')                {                    e_i=i;                    e_y=j;                }            }        }        printf("%d\n",bfs());            }    return 0;}






0 0
原创粉丝点击