zoukankan      html  css  js  c++  java
  • 洛谷P1126 机器人搬重物 广搜

    洛谷P1126 机器人搬重物
    广搜
    这道题其实题目不大清楚
    最好配合图片 和 样例一起看
    每个点如果是 1 其实管辖的是 上方的点 左边的点 以及 左上方的点

     1 #include <bits/stdc++.h> 
     2 #define For(i,j,k) for(int i=j;i<=k;i++)
     3 using namespace std ; 
     4 
     5 const int dx[4] = { 0,1,0,-1 } ; 
     6 const int dy[4] = { 1,0,-1,0 } ; 
     7 const int N = 61 ; 
     8 int n,m,sx,sy,tx,ty,dir,tmp ; 
     9 int a[N][N] ; 
    10 char s[3] ; 
    11 struct node{
    12     int x,y,dir,step ; 
    13 };
    14 queue<node> Q ; 
    15 bool visit[51][51][4] ; 
    16 bool flag ; 
    17 
    18 inline void impossible() 
    19 {
    20     printf("-1
    ") ; 
    21     exit(0) ; 
    22 }
    23 
    24 inline void bfs(int x,int y,int dir) 
    25 {
    26     node p,q ; 
    27     p.x = x; p.y = y ; p.dir = dir ; p.step = 0 ; 
    28     Q.push(p) ;
    29     visit[ p.x ][p.y][p.dir] = 1 ;  
    30     while(!Q.empty()) {
    31         p = Q.front() ; 
    32         Q.pop() ; 
    33         For(i,1,5) {
    34             q = p ; q.step++ ; 
    35             bool flag = 0 ; 
    36             if(i<=3) {
    37                 For(j,1,i) {   //要注意的是要把这几步中的都验证一遍 
    38                             //防止出现跳跃障碍物的情况 
    39                     q.x+=dx[ q.dir ] ; 
    40                     q.y+=dy[ q.dir ] ; 
    41                     if(a[q.x][q.y]) flag = 1 ; 
    42                 }
    43             }
    44             else {
    45                 if(i==4) q.dir = (q.dir+1)%4 ; 
    46                 else     q.dir = ((q.dir-1)%4+4)%4 ; 
    47             } 
    48             if(flag) continue ; 
    49             if(visit[ q.x ][q.y][q.dir]) continue ; 
    50             if(a[q.x][q.y]) continue ; 
    51             if(!(q.x>=1&&q.x < n&&q.y>=1&&q.y < m) ) continue ;  
    52             visit[ q.x ][q.y][q.dir] = 1 ; 
    53             
    54             Q.push(q) ; 
    55             if(q.x==tx&&q.y==ty) {
    56                 printf("%d
    ",q.step) ;  
    57                 exit(0) ; 
    58             }
    59         }
    60     }
    61 }
    62 
    63 int main() 
    64 {
    65     scanf("%d%d",&n,&m) ; 
    66     For(i,1,n) 
    67         For(j,1,m) {
    68             scanf("%d",&a[ i ][ j ]) ; 
    69             if(a[i][j]) a[i-1][j] = a[i][j-1] = a[i-1][j-1] = 1 ; 
    70         }
    71     For(i,1,n) a[i][m] = 1 ; 
    72     For(i,1,m) a[n][i] = 1 ; 
    73     scanf("%d%d%d%d%s",&sx,&sy,&tx,&ty,s) ; 
    74     if(a[sx][sy]) 
    75         impossible() ; 
    76     if(sx==tx&&sy==ty) {       //   特判  起点与终点重合   
    77         printf("0
    ") ; 
    78         exit(0) ; 
    79     }    
    80     if(s[0]=='E') dir = 0 ;
    81     if(s[0]=='S') dir = 1 ;
    82     if(s[0]=='W') dir = 2 ;
    83     if(s[0]=='N') dir = 3 ; 
    84     bfs(sx,sy,dir) ; 
    85     printf("-1") ;   //  如果一直没有终止  说明没到终点,无法到达  输出  -1      
    86     return 0 ; 
    87 }
  • 相关阅读:
    2016.10.15先占坑
    2016.10.11先占坑
    2016.10.13先占坑
    2016.10.7先占坑
    main()里面为什么要放String[] args
    对于一个给定的正整数 n ,请你找出一共有多少种方式使 n 表示为若干个连续正整数的和,要求至少包括两个正整数。
    求两个数的最大公约数的三种算法总结
    C++
    Dev-c5.11的使用
    客户端和服务器端的交互(未完待续)
  • 原文地址:https://www.cnblogs.com/third2333/p/7222400.html
Copyright © 2011-2022 走看看