• 洛谷P1649 [USACO07OCT]障碍路线Obstacle Course BFS 最小转弯


    洛谷P1649 [USACO07OCT]障碍路线Obstacle Course   BFS 最小转弯

     1 #include <cstdio> 
     2 #include <cmath>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <iostream> 
     6 #include <iomanip> 
     7 #include <string> 
     8 #include <algorithm> 
     9 #define LL long long 
    10 #define For(i,j,k) for(int i=j;i<=k;i++) 
    11 #define Dow(i,j,k) for(int i=j;i>=k;i--) 
    12 using namespace std ;  
    13 
    14 const int N = 111 ; 
    15 const int dx[4]={1,0,-1,0} ; 
    16 const int dy[4]={0,1,0,-1} ; 
    17 struct node{
    18     int x,y,dir,step ; 
    19 }q[40011];
    20 int n,sx,sy,tx,ty,h,t ; 
    21 bool visit[4][N][N],flag[N][N] ; 
    22 char s[3] ; 
    23 
    24 inline int read() 
    25 {
    26     int x = 0 , f = 1 ; 
    27     char ch = getchar() ; 
    28     while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar(); } 
    29     while(ch>='0'&&ch<='9') { x = x * 10+ch-48 ; ch = getchar(); } 
    30     return x * f ; 
    31 }
    32 
    33 inline void bfs(int x,int y) 
    34 {
    35     h = 0 ; t = 0 ; 
    36     q[++t].x = x ; q[t].y = y ; q[t].dir = 0 ; visit[0][x][y] = 1 ; 
    37     q[++t].x = x ; q[t].y = y ; q[t].dir = 1 ; visit[1][x][y] = 1 ; 
    38     q[++t].x = x ; q[t].y = y ; q[t].dir = 2 ; visit[2][x][y] = 1 ; 
    39     q[++t].x = x ; q[t].y = y ; q[t].dir = 3 ; visit[3][x][y] = 1 ; 
    40     while(h<t) {
    41         int xx,yy,d,st ; 
    42         x = q[++h].x ; y=q[h].y ; d=q[h].dir ; st=q[h].step ; 
    43         For(i,1,n) {
    44             xx = x+dx[d]*i ; 
    45             yy = y+dy[d]*i ; 
    46             if(xx<1||xx>n||yy<1||yy>n||flag[xx][yy]) break ;    //
    47             if(visit[d][xx][yy]) continue ; //
    48             visit[d][xx][yy] = 1 ; 
    49             q[++t].x = xx ; q[t].y = yy ; q[t].dir=d ; q[t].step=st ; 
    50             if(xx==tx&&yy==ty) {
    51                 printf("%d
    ",q[t].step) ; 
    52                 return ; 
    53             }
    54         }
    55         d = (d+1)%4 ; 
    56         if(!visit[d][x][y])  {
    57             visit[d][x][y] = 1 ; 
    58             q[++t].x = x ; q[t].y = y ; q[t].dir = d ; q[t].step = st+1 ; 
    59         }
    60         d = (d+2)%4 ; 
    61         if(!visit[d][x][y]) {
    62             visit[d][x][y] = 1 ; 
    63             q[++t].x = x ; q[t].y = y ; q[t].dir = d ; q[t].step = st+1 ; 
    64         }
    65     }
    66     printf("-1
    ") ; 
    67 }
    68 
    69 int main() 
    70 {
    71     n = read() ; 
    72     For(i,1,n) {
    73         For(j,1,n) {
    74             scanf("%s",s+1) ;  
    75             if(s[1]=='x') flag[i][j]=1 ; 
    76             if(s[1]=='A') sx = i , sy = j ; 
    77             if(s[1]=='B') tx = i , ty = j ; 
    78         }
    79     }
    80     bfs(sx,sy) ; 
    81     return 0 ; 
    82 }
  • 相关阅读:
    白话经典算法系列之六 高速排序 高速搞定
    簡單SQL存儲過程實例
    ACE编译运行错误解决
    shell之变量与read
    Java实现第八届蓝桥杯魔方状态
    Java实现第八届蓝桥杯魔方状态
    Java实现第八届蓝桥杯魔方状态
    Java实现第八届蓝桥杯魔方状态
    Java实现第八届蓝桥杯购物单
    Java实现第八届蓝桥杯购物单
  • 原文地址:https://www.cnblogs.com/third2333/p/7623499.html
Copyright © 2020-2023  润新知