题意:求左下角到右上角的最短路,按照方向输出  

解题思路:优先方向的广搜,格式错误判WA

解题代码:

  1 // File Name: 2594.c
  2 // Author: darkdream
  3 // Created Time: 2013年09月07日 星期六 22时18分29秒
  4 
  5 #include<stdio.h>
  6 #include<string.h>
  7 #include<stdlib.h>
  8 #include<time.h>
  9 #include<math.h>
 10 #define LL long long
 11 int map[1000][1000];
 12 int visit[1000][1000];
 13 char str[1000][1000];
 14 //freopen("/home/plac/problem/input.txt","r",stdin);
 15 //freopen("/home/plac/problem/output.txt","w",stdout);
 16 int xadd[] = {0,0,1,-1,0,0,1,-1};
 17 int yadd[] = {1,-1,0,0,1,-1,0,0};
 18 int n, m;
 19 struct node{
 20     int  x , y ,k,last;
 21 }list[1000*1000];
 22 struct node1
 23 {
 24     int x, y ;
 25 }step[1000*1000];
 26 int is(int x,int y)
 27 {
 28     if(str[x][y] == '+')
 29         return 1; 
 30     return 0 ;
 31 }
 32 int main(){
 33     int t ;
 34     scanf("%d",&t);
 35     while(t--)
 36     {
 37         scanf("%d %d\n",&n,&m);
 38         n = n*2-1;
 39         m = m*2-1;
 40         memset(map,0,sizeof(map));
 41         memset(visit,0,sizeof(visit));
 42         memset(step,0,sizeof(step));
 43         memset(list,0,sizeof(list));
 44         memset(str,0,sizeof(str));
 45         for(int i =1;i<= n;i ++)
 46         {
 47             gets(&str[i][1]);
 48             for(int j = 1;j <= m;j ++)
 49             {
 50                 if(str[i][j] == '+' || str[i][j] == '|' || str[i][j] == '-')
 51                     map[i][j] = 1; 
 52             }
 53         }
 54         list[1].x = n; 
 55         list[1].y = 1;
 56         list[1].last = 0 ; 
 57         list[1].k = 0 ; 
 58         int low = 1,high = 1 ;
 59         /*for(int i =1;i <= n;i ++)
 60           {
 61           for(int j = 1; j<=m;j++)
 62           printf("%d ",map[i][j]);
 63           printf("\n");
 64           }*/
 65         while(low <= high)
 66         {
 67             if(list[low].x == 1 && list[low].y == m)
 68             {
 69                 break;
 70             }
 71                 for(int i = list[low].k ;i <= list[low].k+3; i++)
 72                 {
 73                     int tx = list[low].x + xadd[i];
 74                     int ty = list[low].y + yadd[i];
 75                     if(map[tx][ty] && !visit[tx][ty])
 76                     {
 77                         visit[tx][ty] = 1; 
 78                         high ++;
 79                         list[high].x = tx;
 80                         list[high].y = ty;
 81                         list[high].last = low;
 82                         list[high].k = i % 4;  
 83                     }
 84                 }
 85             low++;
 86         }
 87         int k = 0;
 88         while(list[low].last)
 89         {
 90             k++;
 91             step[k].x = list[low].x;
 92             step[k].y = list[low].y;
 93             low = list[low].last;
 94         }
 95         /*    for(int i = k ;i >= 1; i --)
 96             {
 97             printf("%d %d\n",step[i].x,step[i].y);
 98             } */
 99         int ld,d;
100         if(step[k].x == n-1)
101         {
102             printf("N\n");
103             ld = 1; 
104         }else{
105             printf("E\n");
106             ld = 2;
107         }
108         for(int i = k-1 ;i >= 1;i --){
109             if(ld == 1)
110             {
111                 if(step[i].x - step[i+1].x == -1)
112                 {
113                     d = 1;
114                     if(is(step[i+1].x,step[i+1].y))
115                         printf("F");
116                 }else if(step[i].y - step[i+1].y == 1){
117                         printf("R");
118                     d = 2; 
119                 }else {
120                         printf("L");
121                     d = 4;
122                 }
123             }
124             else if(ld == 2){
125                 if(step[i].y - step[i+1].y == 1)
126                 {
127                     d = 2;
128                     if(is(step[i+1].x,step[i+1].y))
129                         printf("F");
130                 }else if(step[i].x - step[i+1].x == 1){
131                         printf("R");
132                     d = 3; 
133                 }else {
134                         printf("L");
135                     d = 1;
136                 }
137 
138             }else if(ld == 3){
139                 if(step[i].x - step[i+1].x == 1)
140                 {
141                     d = 3;
142                     if(is(step[i+1].x,step[i+1].y))
143                         printf("F");
144                 }else if(step[i].y - step[i+1].y == 1){
145                         printf("L");
146                     d = 2; 
147                 }else {
148                         printf("R");
149                     d = 4;
150                 }
151 
152 
153             }else {
154                 if(step[i].y - step[i+1].y == -1)
155                 {
156                     d = 4;
157                     if(is(step[i+1].x,step[i+1].y))
158                         printf("F");
159                 }else if(step[i].x - step[i+1].x == 1){
160                         printf("L");
161                     d = 3; 
162                 }else {
163                         printf("R");
164                     d = 1;
165                 }
166 
167 
168             }
169             ld = d;    
170         }
171         printf("\n");
172         if(t != 0 )
173             printf("\n");
174     }
175     return 0 ;
176 }
View Code
posted on 2013-09-08 10:58  dark_dream  阅读(456)  评论(0编辑  收藏  举报