CDOJ 搜索专题训练A

来源:互联网 发布:曼彻斯特 知乎 编辑:程序博客网 时间:2024/06/06 21:06
#include <map>#include <set>#include <list>#include <cmath>#include<cctype>#include <ctime>#include <deque>#include <stack>#include <queue>#include <cstdio>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define PI 3.1415926535897932626using namespace std;int gcd(int a, int b){return a % b == 0 ? b : gcd(b, a % b);}#define MAXN 200550char G[55][55];int vis[55][55];int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};struct special{    int x1,y1;//对应传送点    int x2,y2;}trans[30];struct node{    int x, y;    int dist;}q[MAXN];int start_x,start_y;int end_x,end_y;int ans;int sym[30];int N,M;void read(){    memset(sym,0,sizeof(sym));    scanf("%d%d",&N,&M);    for (int i=0;i<N;i++)    {        getchar();        for (int j=0;j<M;j++)        {            scanf("%c",&G[i][j]);            if (islower(G[i][j]))            {                if (!sym[G[i][j]-'a'])                {                    trans[G[i][j]-'a'].x1=i;                    trans[G[i][j]-'a'].y1=j;                    sym[G[i][j]-'a']=1;                }                else                {                    trans[G[i][j]-'a'].x2=i;                    trans[G[i][j]-'a'].y2=j;                }            }            if (G[i][j]=='L') {start_x=i;start_y=j;}            if (G[i][j]=='Q')  {end_x=i;end_y=j;}        }    }   // printf("%d %d %d %d\n",start_x,start_y,end_x,end_y);   // for (int i=0;i<26;i++)if (sym[i]) printf("%d %d %d %d\n",trans[i].x2,trans[i].y2,trans[i].x1,trans[i].y1);}void bfs(){    memset(vis,0,sizeof(vis));    int front=0,rear=1;    q[0].x=start_x;q[0].y=start_y;    q[0].dist=0;    vis[start_x][start_y]=1;    node s,u;    while (front<rear)    {        u=q[front];        //printf("%d %d %d\n",u.x,u.y,u.dist);        if (u.x==end_x && u.y==end_y)        {            ans=u.dist;            return ;        }        for (int d=0;d<4;d++)        {            int nx=u.x+dx[d];            int ny=u.y+dy[d];            if (nx>=0 && nx<N && ny>=0 && ny<M && !vis[nx][ny] && G[nx][ny]!='#')            {                if (islower(G[nx][ny]))                {                    int index=G[nx][ny]-'a';                    if (nx==trans[index].x1 && ny==trans[index].y1)                    {                        s.x=trans[index].x2;s.y=trans[index].y2;                        s.dist=u.dist+1;                        q[rear++]=s;                    }                    else                    {                        s.x=trans[index].x1;s.y=trans[index].y1;                        s.dist=u.dist+1;                        q[rear++]=s;                    }                }                else                {                    s.x=nx;s.y=ny;                    s.dist=u.dist+1;                    vis[nx][ny]=1;                    q[rear++]=s;                }            }        }        front++;    }    ans=-1;}int main(){    //freopen("sample.txt","r",stdin);    int T;    scanf("%d",&T);    while (T--)    {        ans=0;        read();        bfs();        printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击