• Children of the Candy Corn


    http://poj.org/problem?id=3083

    S为起点,E为中点,输出S—>E沿左边走的步数,沿右边走的步数,和最短步数。

    因为S—>E沿左边走的步数等于E—>S沿右边走的步数,故只需DFS搜索沿右边走的步数,改变起止点即可。

    然后BFS搜索最少步数。

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <queue>
     4 #include <string.h>
     5 
     6 using namespace std;
     7 const int N=55;
     8 char map[N][N];
     9 int dir[4][2] = {{0,-1},{-1,0},{0,1},{1,0}};//顺时针方向
    10 int step1[N][N];//记录步数
    11 
    12 struct node
    13 {
    14     int x;
    15     int y;
    16 };
    17 int DFS(int i,int j,int step,int d,char ss)//沿右边走
    18 {
    19     if (map[i][j]== ss) return step;
    20     for (int k = d+4; k > d; k --)
    21     {
    22         int di = i + dir[k%4][0];
    23         int dj = j + dir[k%4][1];
    24         if (map[di][dj]!='#')
    25             return DFS(di,dj,step+1,(k+1)%4,ss);
    26     }
    27     return -1;
    28 }
    29 int BFS(int i,int j)//计算最短步数
    30 {
    31     queue<node> q;
    32     node  t;
    33     t.x=i,t.y=j;
    34     q.push(t);
    35     step1[t.x][t.y]=1;
    36     while(!q.empty())
    37     {
    38         t=q.front();
    39         q.pop();
    40         if(map[t.x][t.y]=='E')return step1[t.x][t.y];
    41         node temp;
    42         for(int d=0; d<4; ++d)
    43         {
    44             temp=t;
    45             temp.x+=dir[d][0];
    46             temp.y+=dir[d][1];
    47             if(map[temp.x][temp.y]!='#' && !step1[temp.x][temp.y])
    48             {
    49                 q.push(temp);
    50                 step1[temp.x][temp.y]=step1[t.x][t.y]+1;
    51             }
    52         }
    53     }
    54     return -1;
    55 }
    56 int main()
    57 {
    58     int T,col,row;
    59     scanf("%d",&T);
    60     while(T--)
    61     {
    62         scanf("%d%d%*c",&col,&row);
    63         int s_i,s_j,e_i,e_j;
    64         memset(step1,0,sizeof(step1));
    65         memset(map,'#',sizeof(map));
    66 
    67         for (int i = 1; i <= row; i ++)
    68         {
    69             for (int j = 1; j <= col; j ++)
    70             {
    71                 scanf("%c",&map[i][j]);
    72                 if (map[i][j]=='S')
    73                 {
    74                     s_i = i;
    75                     s_j = j;
    76                 }
    77                 if (map[i][j]=='E')
    78                 {
    79                     e_i = i;
    80                     e_j = j;
    81                 }
    82             }
    83             getchar();
    84         }
    85         int ansl = DFS(e_i,e_j,1,0,'S');//E——>S沿右边走的步数,也是S——>E沿左边走的步数
    86         int ansr = DFS(s_i,s_j,1,0,'E');//S——>E沿右边走的步数
    87         int minstep = BFS(s_i,s_j);//S—— E的最少步数
    88         printf("%d %d %d
    ",ansl,ansr,minstep);
    89     }
    90     return 0;
    91 }
    View Code
  • 相关阅读:
    Android Studio快捷键
    Eclipse常用快捷键
    沉浸式状态栏
    JAVA起名规范
    c语言求数组长度
    自定义checkbox风格
    退出所有应用,监控打开了什么活动
    android权限大全
    广播接收者Receiver
    ImageView的常用属性
  • 原文地址:https://www.cnblogs.com/lahblogs/p/3256787.html
Copyright © 2020-2023  润新知