• bzoj3299 [USACO2011 Open]Corn Maze玉米迷宫


    Description

    今年秋天,约翰带着奶牛们去玩玉米迷宫。迷宫可分成NxM个格子,有些格子种了玉 米,种宥玉米的格子无法通行。 
    迷宫的四条边界上都是种了玉米的格子,其屮只有一个格子 没种,那就是出口。 
    在这个迷宫里,有一些神奇的传送点6每个传送点由一对点组成,一旦 走入传送点的某个结点, 
    机器就会强制把你送到传送点的另一头去。所有的传送点都是双向 的,如果你定到了另一头,机器也会把你送回来。 

    奶牛在一个单位的时间内只能向相邻的四个方向移动一格,不过传送机传送是瞬间完成 的。 
    现在W西在迷宫里迷路了,她只知道目前的位罝在哪里,请你帮助她用最短的时间走出 迷宫吧。

    Input

    第一行:两个用空格分开的整数:N和M,2 
    第二行到N+1行:第i+1行有M个连续的字符,描述了迷宫第i行的信息。其中"#"代 表不能通行的玉米地, 
    "."代表可以通行的草地,"@"代表贝西的起始位罝,"="代表迷宫出口, 
    大写字母“A”到“Z”总是成对出现的,代表一对传送点 

    Output

     

    第一行:一个整数,表示贝西走出迷宫的最短时间,保证逃离迷宮的路线一定存在

    Sample Input


    5 6
    ###=##
    #.W.##
    #.####
    #.@W##
    ######

    Sample Output

    3

    HINT

     

    从起点向右走,通过w传送,再从另一端 走出迷宫

    现在连sb广搜都会错……

    要tp之后再判断不合法情况

    #include<cstdio>
    #include<cstring>
    #define N 510
    const int mx[4]={0,1,0,-1};
    const int my[4]={1,0,-1,0};
    struct go{int x1,x2,y1,y2;}going[30];
    int n,m;
    int x1,y1,x2,y2,t,w=1;
    int mrk[N][N];
    bool sent[N][N];
    int gox[N][N],goy[N][N];
    int qx[N*N];
    int qy[N*N];
    int dist[N][N];
    inline void bfs()
    {
    	memset(dist,-1,sizeof(dist));
    	qx[1]=x1;
    	qy[1]=y1;
    	mrk[x1][y1]=1;
    	dist[x1][y1]=0;
    	while (t<w)
    	{
    		int nx=qx[++t];
    		int ny=qy[t];
    		if (nx==x2&ny==y2)return;
    		for (int k=0;k<4;k++)
    		  {
    			int wx=nx+mx[k];
    			int wy=ny+my[k];
    			if (sent[wx][wy])
    			{
    				int savx=wx,savy=wy;
    				wx=gox[savx][savy];
    				wy=goy[savx][savy];
    			}
    			if (wx<1||wx>n||wy<1||wy>m||mrk[wx][wy])continue;
    			mrk[wx][wy]=1;
    			dist[wx][wy]=dist[nx][ny]+1;
    			qx[++w]=wx;
    			qy[w]=wy;
    		  }
    	}
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=n;i++)
    	  for (int j=1;j<=m;j++)
    	     {
    	     	char ch=getchar();
    	     	while (ch!='#'&&ch!='='&&ch!='.'&&ch!='@'&&(ch<'A'||ch>'Z'))ch=getchar();
    	     	if (ch=='@'){x1=i;y1=j;}else
    	     	if (ch=='#')mrk[i][j]=1;else
    	     	if (ch=='='){x2=i;y2=j;}else
    	     	if (ch>='A'&&ch<='Z')
    	     	{
    	     		int rnk=ch-'A'+1;
    	     		sent[i][j]=1;
    	     		if (!going[rnk].x1)
    	     		{
    	     			going[rnk].x1=i;
    	     			going[rnk].y1=j;
    	     		}else
    	     		{
    	     			going[rnk].x2=i;
    	     			going[rnk].y2=j;
    	     		}
    	     	}
    	     }
    	for(int i=1;i<=26;i++)
    	  if (going[i].x1)
    	  {
    	  	int X1=going[i].x1;
    	  	int Y1=going[i].y1;
    	  	int X2=going[i].x2;
    	  	int Y2=going[i].y2;
    	  	gox[X1][Y1]=X2;
    	  	goy[X1][Y1]=Y2;
    	  	gox[X2][Y2]=X1;
    	  	goy[X2][Y2]=Y1;
    	  }
    	bfs();
    	printf("%d",dist[x2][y2]);
    }
    

      

    ——by zhber,转载请注明来源
  • 相关阅读:
    记忆化搜索 E
    网络流 O
    线段树 B数据结构 牛客练习赛28
    N
    线段树 G
    K
    F
    补一下昨天的博客 J
    selenium-1-python
    selenium入门知识
  • 原文地址:https://www.cnblogs.com/zhber/p/4035906.html
Copyright © 2020-2023  润新知