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 |
WA了.....好心人帮忙看看#include <iostream> #include <queue> using namespace std; struct node { int x, y; }; const int MAX = 25; char maze[MAX][MAX]; bool gone[MAX][MAX], getKey[5], wait[5]; int nxt[4][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }, key[5], m, n; node s, g, door[5]; void init () { memset ( gone, 0, sizeof(gone) ); memset ( key, 0, sizeof(key) ); memset ( getKey, 0, sizeof(getKey) ); for ( int i = 1; i <= m; ++i ) for ( int j = 1; j <= n; ++j ) cin >> maze[i][j]; for ( int i = 0; i <= m + 1; ++i ) maze[i][0] = maze[i][n+1] = '/'; for ( int j = 0; j <= n + 1; ++j ) maze[0][j] = maze[m+1][j] = '/'; for ( int i = 1; i <= m; ++i ) for ( int j = 1; j <= n; ++j ) if ( maze[i][j] == 'G' ){ g.x = i; g.y = j; } else if ( maze[i][j] == 'S' ){ s.x = i; s.y = j; } else if ( maze[i][j] >= 'a' && maze[i][j] <= 'e' ){ getKey[maze[i][j]-'a'] = 1; ++key[maze[i][j]-'a']; } else ; return; } int BFS() { queue<node> qu; node temp, next; qu.push(s); gone[s.x][s.y] = 1; bool success = 0; while ( !qu.empty() ){ //可以走 temp = qu.front(); qu.pop(); if ( temp.x == g.x && temp.y == g.y ){ //GG~ success = 1; break; } else { for ( int i = 0; i != 4; ++i ){ //对每个方向的那一格 next.x = temp.x + nxt[i][0]; next.y = temp.y + nxt[i][1]; if ( maze[next.x][next.y] >= 'a' && maze[next.x][next.y] <= 'e' && !gone[next.x][next.y] ){//如果是钥匙 qu.push(next); //走过去 gone[next.x][next.y] = 1; --key[maze[next.x][next.y]-'a'];//捡锁匙 if ( !key[maze[next.x][next.y]-'a'] && wait[maze[next.x][next.y]-'a'] ){//捡完之后如果锁匙够了 且有门等待着开 qu.push(door[maze[next.x][next.y]-'a']); //等阵就走那扇门 gone[door[maze[next.x][next.y]-'a'].x][door[maze[next.x][next.y]-'a'].y] = 1; } } else if ( maze[next.x][next.y] >= 'A' && maze[next.x][next.y] <= 'E' && !gone[next.x][next.y] ){//如果是门 if ( getKey[maze[next.x][next.y]-'A'] ){//如果有这样的锁匙 (因为有门不一定有锁匙) if ( !key[maze[next.x][next.y]-'A'] ){//如果锁匙够了! qu.push(next); //开门 gone[next.x][next.y] = 1; } else { //否则锁匙不够 door[maze[next.x][next.y]-'A'] = temp; wait[maze[next.x][next.y]-'A'] = 1; //等着开 } } else gone[next.x][next.y] = 1; //不能走的门当走过了 } else if ( maze[next.x][next.y] != '/' && maze[next.x][next.y] != 'X' && !gone[next.x][next.y] ){//正常移动 qu.push(next); gone[next.x][next.y] = 1; } else ; } } } return success; } int main() { while ( cin >> m >> n && m && n ){ init(); if ( BFS() ) cout << "YES" << endl; else cout << "NO" << endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator