Bzoj4394 [usaco 2015 Dec] Bessie

Source: Internet
Author: User

Bzoj4394 [usaco 2015 Dec] Bessie
Description

After eating too much fruit in Farmer John's kitchen, Bessie the cow is getting some very strange dreams! In her most recent dream, she is trapped in a maze in the shape of an N x M grid of tiles (1 ≤ N, M ≤ 1,000 ). she starts on the top-left tile and wants to get to the bottom-right tile. when she is standing on a tile, she can potentially move to the adjacent tiles in any of the four cardinal directions ctions.

But wait! Each tile has a color, and each color has a different property! Bessie's head hurts just thinking about it:

If a tile is red, then it is impassable.
If a tile is pink, then it can be attached ed on normally.
If a tile is orange, then it can be attached ed on normally, but will make Bessie smell like oranges.
If a tile is blue, then it contains piranhas that will only let Bessie pass if she smells like oranges.
If a tile is purple, then Bessie will slide to the next tile in that direction (unless she is unable to cross it ). if this tile is also a purple tile, then Bessie will continue to slide until she lands on a non-purple tile or hits an impassable tile. sliding through a tile counts as a move. purple tiles will also remove Bessie's smell.

(If you're confused about purple tiles, the example will have strate their use .)

Please help Bessie get from the top-left to the bottom-right in as few moves as possible.

 

The cow Bessie is trapped in the mesh maze of N * M. She is located in the upper left corner () and the exit is in the lower right corner (N, M ). Bessie can only walk up, down, and left.

Each tile has a color:

If it is red, it is not accessible.

If it is pink, you can pass.

If it is orange, it can pass, but it will bring the orange smell to Bessie.

If it is blue, it can only pass when Bessie Smells orange.

If it is purple, Bessie will continue to slide in the original direction. If it is still purple, it will continue to slide. It stops when it slides onto a non-purple tile or is not accessible. And this will eliminate the smell of Bessie. It takes a unit of time to slide and walk each step.

Output the shortest time required for Bessie to escape to the exit.

 

Input

The first line has two integers N and M, representing the number of rows and columns of the maze.

The next NN lines have MM integers each, representing the maze:

The integer '0' is a red tile
The integer '1' is a pink tile
The integer '2' is an orange tile
The integer '3' is a blue tile
The integer '4' is a purple tile

The top-left and bottom-right integers will always be '1 '.

Output

A single integer, representing the minimum number of moves Bessie must use to cross the maze, or-1 if it is impossible to do so.

Sample Input4 4
1 0 2 1
1 1 4 1
1 0 4 0
1 3 1 1 Sample Output10HINT

 

In this example, Bessie walks one square down and two squares to the right (and then slides one more square to the right ). she walks one square up, one square left, and one square down (sliding two more squares down) and finishes by walking one more square right. this is a total of 10 moves (DRRRULDDDR ).

 

SourceBFS, creating a graph is troublesome (see the code for details)

 

 

This is the standard process

 

# Include
 
  
# Include
  
   
# Include
   
    
# Include
    
     
# Include
     
      
# Include
      
        # Include
       
         Using namespace std; int dr [] = {-1, 0, 1, 0}; int dc [] = {0,-1, 0, 1 }; struct state {int r; int c; int ld; bool smell; state (int r, int c, int ld, bool smell): r (r), c (c ), ld (ld), smell (smell) {} int pack () {return (smell? 1: 0) + 2 * (ld + 1) + 10 * c + 10000 * r;} static state unpack (int x) {return state (x/10000, (x/10) % 1000, (x/2) % 5-1, x & 1) ;}; int getcell (const vector
        
          > & A, int r, int c) {if (r <0 | r> =. size () | c <0 | c> = A [r]. size () {return 0;} return A [r] [c];} int main () {ios_base: sync_with_stdio (false); int N, M; cin> N> M; vector
         
           > A (N, vector
          
            (M); for (int I = 0; I <N; I ++) {for (int j = 0; j <M; j ++) {cin> A [I] [j] ;}} queue
           
             Q; vector
            
              D (10000000,-1); int s = state (0, 0,-1, false ). pack (); q. push (s); D [s] = 0; while (! Q. empty () {state st = state: unpack (q. front (); q. pop (); // cout <
             
              

 

This is my program, there are two points WA... I don't know why

 

#include
               
                #include
                
                 #include
                 
                  #include
                  
                   #include
                   
                    #include#include
                    
                     #define F(i,j,n) for(int i=j;i<=n;i++)#define maxn 1100#define maxm 20000100using namespace std;int n,m,a[maxn][maxn],d[maxm];int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};struct node{int x,y,dir,sme;}now,nxt;queue
                     
                       q;inline int read(){int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}inline int num(node tmp){return tmp.sme+2*(tmp.dir+1)+10*(tmp.x-1)+10000*(tmp.y-1);}int main(){n=read();m=read();F(i,1,n) F(j,1,m) a[i][j]=read();memset(d,-1,sizeof(d));now=(node){1,1,-1,0};d[num(now)]=0;q.push(now);while (!q.empty()){now=q.front();q.pop();cout<
                      
                       n||ty<1||ty>m) continue;if (a[tx][ty]!=0&&a[tx][ty]!=3){nxt=(node){tx,ty,now.dir,a[tx][ty]==2};if (d[num(nxt)]!=-1) continue;d[num(nxt)]=d[num(now)]+1;q.push(nxt);continue;}}F(i,0,3){int tx=now.x+dx[i],ty=now.y+dy[i];if (tx<1||tx>n||ty<1||ty>m) continue;if (a[tx][ty]==0||(a[tx][ty]==3&&!now.sme)) continue;int ts=a[tx][ty]==2?1:(a[tx][ty]==4?0:now.sme);nxt=(node){tx,ty,i,ts};if (d[num(nxt)]!=-1) continue;d[num(nxt)]=d[num(now)]+1;q.push(nxt);}}printf("-1\n");return 0;}
                      
                     
                    
                   
                  
                 
                
               


 

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.