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
原文地址:https://www.cnblogs.com/lahblogs/p/3256787.html