- #include <stdio.h>
- #include <string.h>
- int right[4][2] = { {1,0},{0,1},{-1,0},{0,-1} };
- int left[4][2] = { {1,0},{0,-1},{-1,0},{0,1} };
- char map[45][45];
- int si, sj, ei, ej;
- int dir;
- int q[2500][2];
- int flag[45][45];
- int n, m;
- int dfs_left(int ni, int nj, int step)
- {
- if ( ni==ei && nj==ej )
- return step+1;
- if ( ni<0 || ni>=n || nj<0 || nj>=m )
- return 0;
- if ( map[ni][nj]=='#' )
- return 0;
- dir = (dir+3)%4;
- while ( 1 )
- {
- int tmp = dfs_left( ni+left[dir][0], nj+left[dir][1], step+1 );
- if ( tmp>0 )
- break;
- dir = (dir+1)%4;
- }
- }
- int dfs_right(int ni, int nj, int step)
- {
- if ( ni==ei && nj==ej )
- return step+1;
- if ( ni<0 || ni>=n || nj<0 || nj>=m )
- return 0;
- if ( map[ni][nj]=='#' )
- return 0;
- dir = (dir+3)%4;
- while ( 1 )
- {
- int tmp = dfs_right( ni+right[dir][0], nj+right[dir][1], step+1 );
- if ( tmp>0 )
- break;
- dir = (dir+1)%4;
- }
- }
- int bfs()
- {
- memset( flag, 0, sizeof(flag) );
- int head = 0;
- int tail = 0;
- q[tail][0] = si;
- q[tail++][1] = sj;
- flag[si][sj] = 1;
- int step = 0;
- while ( head<tail && flag[ei][ej]==0 )
- {
- int tmp = tail;
- step++;
- while ( head<tmp && flag[ei][ej]==0 )
- {
- int ni = q[head][0];
- int nj = q[head++][1];
- for ( int i=0; i<4; i++ )
- {
- int ti = ni+left[i][0];
- int tj = nj+left[i][1];
- if ( ti>=0 && ti<n && tj>=0 && tj<m && flag[ti][tj]==0
- && map[ti][tj]!='#' )
- {
- q[tail][0] = ti;
- q[tail++][1] = tj;
- flag[ti][tj] = 1;
- }
- }
- }
- }
- return step+1;
- }
- int main ()
- {
- int t;
- scanf("%d", &t );
- while ( t-- )
- {
- scanf("%d %d", &m, &n );
- for ( int i=0; i<n; i++ )
- {
- scanf("%s", map[i] );
- for ( int j=0; j<m; j++ )
- {
- if ( map[i][j] =='S' )
- si = i, sj=j;
- if ( map[i][j] =='E' )
- ei = i, ej= j;
- }
- }
- dir = 0;
- printf("%d %d %d/n", dfs_left(si,sj,0), dfs_right(si,sj,0), bfs() );
- }
- return 0;
- }
上面的代码不是我写的是网上搜到的。。。这个题目最优结果不难关键是向左和向右。。。看到讨论里有人写了12K多自己也是写了一晚上码了好多。。向左向右其实也没什么难度只是要写的非常多属于那种硬扯的话是一定扯的出来的题目。。。。于是写着越多越觉的无意义(代码之美里有句话说的好大概记的是说对于厄长的代码要毫不客气的咔嚓掉)。。于是一怒之下全删光了。。。。。。。。。。接着就发现了上面这个代码。。。实在佩服写这个人。。。。说实在的我没看懂。。。。。。。先存着吧。。还要谢谢这位兄弟恩抱歉我拿你的代码AC了=V=。。。。。。。。。。。