| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:循环+BFS~为什么TLE 帮忙看看(152行)In Reply To:循环+BFS~为什么TLE 帮忙看看(152行) Posted by:LostCanvas at 2010-03-22 18:52:30 你的v[sr][sc] = true;v数组没有再次更新
> #include <iostream>
> #include <queue>
> using namespace std;
>
> struct Position
> {
> int r, c, s;
> Position( int x, int y, int z )
> :r( x ), c( y ), s( z ){};
> Position(){}
> };
>
> int l_process();
> int r_process();
> int bfs();
>
> queue<Position> q;
> int sr, sc, er, ec;
> int w, h;
> char maze[40][40];
> bool v[40][40];
> const int move[4][2] = { 0, -1, -1, 0, 0, 1, 1, 0 };
>
> int main()
> {
> int c, i, j;
> scanf( "%d", &c );
> while ( c-- )
> {
> scanf( "%d%d", &w, &h );
> char ctemp;
> for ( i = 0; i < h; ++i )
> {
> scanf( "%c", &ctemp );
> for ( j = 0; j < w; ++j )
> {
> scanf( "%c", &maze[i][j] );
> if ( maze[i][j] == 'S' )
> sr = i, sc = j;
> if ( maze[i][j] == 'E' )
> er = i, ec = j;
> }
> }
> cout << l_process() << ' ' << r_process() << ' ' << bfs() << endl;
> }
> return 0;
> }
>
> int l_process()
> {
> int state;
> if ( sr == h - 1 )
> state = 0;
> else if ( sc == 0 )
> state = 1;
> else if ( sr == 0 )
> state = 2;
> else if ( sc == w - 1 )
> state = 3;
> int step = 1, rt = sr, ct = sc;
> while ( maze[rt][ct] != 'E' )
> {
> if ( maze[rt + move[state][0]][ct + move[state][1]] == '.' )
> {
> ++step;
> rt += move[state][0];
> ct += move[state][1];
> state = ( state + 3 ) % 4;
> continue;
> }
> while ( !( maze[rt + move[state][0]][ct + move[state][1]] == '#' && maze[rt + move[( state + 1 ) % 4][0]][ct + move[( state + 1 ) % 4][1]] == '.' ))
> {
> if ( maze[rt + move[state][0]][ct + move[state][1]] == 'E' )
> {
> return ++step;
> }
> state = ( state + 1 ) % 4;
> }
> ++step;
> rt += move[( state + 1 ) % 4][0];
> ct += move[( state + 1 ) % 4][1];
> }
> return step;
> }
>
> int r_process()
> {
> int state;
> if ( sr == h - 1 )
> state = 0;
> else if ( sc == 0 )
> state = 1;
> else if ( sr == 0 )
> state = 2;
> else if ( sc == w - 1 )
> state = 3;
> int step = 1, rt = sr, ct = sc;
> while ( maze[rt][ct] != 'E' )
> {
> if ( maze[rt + move[( state + 2 ) % 4][0]][ct + move[( state + 2 ) % 4][1]] == '.' )
> {
> ++step;
> rt += move[( state + 2 ) % 4][0];
> ct += move[( state + 2 ) % 4][1];
> state = ( state + 1 ) % 4;
> continue;
> }
> while ( !( maze[rt + move[( state + 2 ) % 4][0]][ct + move[( state + 2 ) % 4][1]] == '#' && maze[rt + move[( state + 1 ) % 4][0]][ct + move[( state + 1 ) % 4][1]] == '.' ))
> {
> if ( maze[rt + move[( state + 2 ) % 4][0]][ct + move[( state + 2 ) % 4][1]] == 'E' )
> {
> return ++step;
> }
> state = ( state + 3 ) % 4;
> }
> ++step;
> rt += move[( state + 1 ) % 4][0];
> ct += move[( state + 1 ) % 4][1];
> }
> return step;
> }
>
> int bfs()
> {
> while ( !q.empty())
> q.pop();
> memset( v, 0, sizeof v );
> q.push( Position( sr, sc, 1 ));
> v[sr][sc] = true;
> int row, col, i;
> Position pos;
> while ( !q.empty())
> {
> pos = q.front();
> q.pop();
> for ( i = 0; i < 4; ++i )
> {
> row = pos.r + move[i][0];
> col = pos.c + move[i][1];
> if ( row >= 0 && row < h && col >= 0 && col < w )
> {
> if ( maze[row][col] == 'E' )
> return ++pos.s;
> if ( maze[row][col] == '.' )
> {
> q.push( Position( row, col, pos.s + 1 ));
> }
> }
> }
> }
> return -1;
> }
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator