题目在 http://poj.org/problem?id=2251
其实这个题目和普通的走迷宫(二维走迷宫思路是一样的),只不过这个题目将迷宫扩展到三维. 最短路径,BFS代码如下:
Source Code
Problem: 2251 | User: hopeztm | |
Memory: 620K | Time: 32MS | |
Language: C++ | Result: Accepted |
- Source Code
#include <stdio.h> #include <memory.h> #define MAX_SIZE 31 #define MAX_Q MAX_SIZE * MAX_SIZE * MAX_SIZE struct Grid { int l; int r; int c; int nTime; const Grid operator + (const Grid &g) const { Grid newGrid = {l + g.l, r + g.r, c + g.c}; return newGrid; } bool operator == (const Grid &g)const { return l == g.l && r == g.r && c == g.c; } }; bool maze[MAX_SIZE][MAX_SIZE][MAX_SIZE]; Grid queue[MAX_Q]; Grid sizeDirection[6] = { {0, 0, 1}, {0, 0, -1}, {0, 1, 0}, {0, -1, 0}, {1, 0, 0}, {-1, 0, 0} }; int nLevel, nRow, nCol; bool LegalGrid(const Grid& g) { if(g.l < 0 || g.l >= nLevel || g.r < 0 || g.r >= nRow || g.c < 0 || g.c >= nCol || maze[g.l][g.r][g.c] == 1) { return false; } return true; } int BFSGetSteps(Grid &start, const Grid &exit) { int rear, front; rear = front = 0; start.nTime = 0; queue[rear++] = start; Grid current, next; while(rear > front) { current = queue[front++]; if(current == exit) { return current.nTime; } for( int i = 0;i < 6; i++) { next = current + sizeDirection[i]; if(LegalGrid(next)) { maze[next.l][next.r][next.c] = 1; next.nTime = current.nTime + 1; queue[rear++] = next; } } } return -1; } int main() { while(scanf("%d%d%d", &nLevel, &nRow, &nCol)) { if( nLevel == 0 && nRow == 0 && nCol == 0) { break; } int iLevel, iRow, iCol; memset(maze, 0, sizeof(maze)); char c; Grid start, exit; char inputLine[256]; for( iLevel = 0; iLevel < nLevel; iLevel++) { for( iRow = 0; iRow < nRow; iRow++) { scanf("%s", inputLine); for(iCol = 0; iCol < nCol; iCol++) { sscanf(inputLine + iCol, "%c", &c); if( c == '#') { maze[iLevel][iRow][iCol] = 1; } if( c == 'S') { start.l = iLevel; start.r = iRow; start.c = iCol; maze[iLevel][iRow][iCol] = 1; } if( c == 'E') { exit.l = iLevel; exit.r = iRow; exit.c = iCol; } } } } int steps = BFSGetSteps(start, exit); if(steps == -1) { printf("Trapped!\n"); } else { printf("Escaped in %d minute(s).\n", steps); } } return 0; }