3D地图问题,从一个点到另一个点,求最小路径,
抽象出地图,搞三维数组就行,广度优先搜索
244K 16MS C++ 3272B 2013-11-29 11:27:06 // 使用stl
612K 0MS C++ 3585B 2013-11-29 11:55:49 // 利用数组模拟队列
代码1: // 使用stl
#include<iostream>
#include<vector>
#include<map>
#include <string>
#include <set>
#include <stack>
#include <queue>
using namespace std;
#include <stdio.h>
#include <string.h>
#define N 30
char g_dun[N][N][N] = {};
// 地牢,层,行,列
bool g_flag[N][N][N] = {};
int g_L = 0;
int g_R = 0;
int g_C = 0;
int g_stL = 0;
int g_stR = 0;
int g_stC = 0;
int g_step = 0;
int g_minStep = INT_MAX;
#define is_move(a, b, c) (a>=0 && a<g_L && b>=0 && b<g_R && c>=0 && c<g_C && ('.' == g_dun[a][b][c] || 'E' == g_dun[a][b][c]) && !g_flag[a][b][c])
struct qData
{
int iL;
int iR;
int iC;
int iStep;
qData(int _in_iInL, int _in_iInR, int _in_iInC, int _in_iStep)
: iL(_in_iInL), iR(_in_iInR), iC(_in_iInC), iStep(_in_iStep)
{
};
};
void bfs(int iInL, int iInR, int iInC)
{
qData fData(0, 0, 0, 0);
queue<qData> que;
que.push(qData(iInL, iInR, iInC, 0));
g_flag[iInL][iInR][iInC] = true;
while(!que.empty())
{
fData = que.front();
que.pop();
if('E' == g_dun[fData.iL][fData.iR][fData.iC])
{
if(g_minStep > fData.iStep)
g_minStep = fData.iStep;
continue;
}
if(fData.iStep >= g_minStep)
{
continue;
}
if(is_move(fData.iL, fData.iR, fData.iC+1)) // 东
{
que.push(qData(fData.iL, fData.iR, fData.iC+1, fData.iStep+1));
g_flag[fData.iL][fData.iR][fData.iC+1] = true;
}
if(is_move(fData.iL, fData.iR+1, fData.iC)) // 南
{
que.push(qData(fData.iL, fData.iR+1, fData.iC, fData.iStep+1));
g_flag[fData.iL][fData.iR+1][fData.iC] = true;
}
if(is_move(fData.iL, fData.iR, fData.iC-1)) // 西
{
que.push(qData(fData.iL, fData.iR, fData.iC-1, fData.iStep+1));
g_flag[fData.iL][fData.iR][fData.iC-1] = true;
}
if(is_move(fData.iL, fData.iR-1, fData.iC)) // 北
{
que.push(qData(fData.iL, fData.iR-1, fData.iC, fData.iStep+1));
g_flag[fData.iL][fData.iR-1][fData.iC] = true;
}
if(is_move(fData.iL+1, fData.iR, fData.iC)) // 上
{
que.push(qData(fData.iL+1, fData.iR, fData.iC, fData.iStep+1));
g_flag[fData.iL+1][fData.iR][fData.iC] = true;
}
if(is_move(fData.iL-1, fData.iR, fData.iC)) // 下
{
que.push(qData(fData.iL-1, fData.iR, fData.iC, fData.iStep+1));
g_flag[fData.iL-1][fData.iR][fData.iC] = true;
}
}
return ;
}
void init()
{
g_step = 0;
g_minStep = INT_MAX;
memset(g_flag, 0, sizeof(g_flag));
char szRow[N+1] = {};
for(int i = 0; i < g_L; i++)
{
for(int j = 0; j < g_R; j++)
{
scanf("%s", szRow);
for(int k = 0; k < g_C; k++)
{
g_dun[i][j][k] = szRow[k];
if('S' == szRow[k])
{
g_stL = i;
g_stR = j;
g_stC = k;
}
}
}
}
}
int main()
{
//int take = ::GetTickCount();
//freopen("out47.txt", "w", stdout);
while(true)
{
scanf("%d %d %d", &g_L, &g_R, &g_C);
if(0 == g_L)
{
break;
}
init();
bfs(g_stL, g_stR, g_stC);
if(INT_MAX == g_minStep)
printf("Trapped!\n");
else
printf("Escaped in %d minute(s).\n", g_minStep);
}
//cout<<::GetTickCount() - take<<endl;
return 0;
}
代码1: // 利用数组模拟队列
#include<iostream>
#include<vector>
#include<map>
#include <string>
#include <set>
#include <stack>
#include <queue>
using namespace std;
#include <stdio.h>
#include <string.h>
#define N 30
char g_dun[N][N][N] = {};
// 地牢,层,行,列
bool g_flag[N][N][N] = {};
int g_L = 0;
int g_R = 0;
int g_C = 0;
int g_stL = 0;
int g_stR = 0;
int g_stC = 0;
int g_minStep = INT_MAX;
#define is_move(a, b, c) (a>=0 && a<g_L && b>=0 && b<g_R && c>=0 && c<g_C && ('.' == g_dun[a][b][c] || 'E' == g_dun[a][b][c]) && !g_flag[a][b][c])
#define Q_N 30000 // 队列长度
int g_que[Q_N][4] = {};
int g_qHead = 0;
int g_qEnd = 0;
void bfs(int iInL, int iInR, int iInC) // 利用数组模拟队列
{
int iStep = 0;
g_que[g_qEnd][0] = iInL;
g_que[g_qEnd][1] = iInR;
g_que[g_qEnd][2] = iInC;
g_que[g_qEnd][3] = iStep;
g_qEnd++;
g_flag[iInL][iInR][iInC] = true;
while(g_qHead != g_qEnd)
{
iInL = g_que[g_qHead][0];
iInR = g_que[g_qHead][1];
iInC = g_que[g_qHead][2];
iStep = g_que[g_qHead][3];
g_qHead++;
if('E' == g_dun[iInL][iInR][iInC])
{
if(g_minStep > iStep)
g_minStep = iStep;
continue;
}
if(iStep >= g_minStep)
{
continue;
}
if(is_move(iInL, iInR, iInC+1)) // 东
{
g_que[g_qEnd][0] = iInL;
g_que[g_qEnd][1] = iInR;
g_que[g_qEnd][2] = iInC+1;
g_que[g_qEnd][3] = iStep + 1;
g_qEnd++;
g_flag[iInL][iInR][iInC+1] = true;
}
if(is_move(iInL, iInR+1, iInC)) // 南
{
g_que[g_qEnd][0] = iInL;
g_que[g_qEnd][1] = iInR+1;
g_que[g_qEnd][2] = iInC;
g_que[g_qEnd][3] = iStep + 1;
g_qEnd++;
g_flag[iInL][iInR+1][iInC] = true;
}
if(is_move(iInL, iInR, iInC-1)) // 西
{
g_que[g_qEnd][0] = iInL;
g_que[g_qEnd][1] = iInR;
g_que[g_qEnd][2] = iInC-1;
g_que[g_qEnd][3] = iStep + 1;
g_qEnd++;
g_flag[iInL][iInR][iInC-1] = true;
}
if(is_move(iInL, iInR-1, iInC)) // 北
{
g_que[g_qEnd][0] = iInL;
g_que[g_qEnd][1] = iInR-1;
g_que[g_qEnd][2] = iInC;
g_que[g_qEnd][3] = iStep + 1;
g_qEnd++;
g_flag[iInL][iInR-1][iInC] = true;
}
if(is_move(iInL+1, iInR, iInC)) // 上
{
g_que[g_qEnd][0] = iInL+1;
g_que[g_qEnd][1] = iInR;
g_que[g_qEnd][2] = iInC;
g_que[g_qEnd][3] = iStep + 1;
g_qEnd++;
g_flag[iInL+1][iInR][iInC] = true;
}
if(is_move(iInL-1, iInR, iInC)) // 下
{
g_que[g_qEnd][0] = iInL-1;
g_que[g_qEnd][1] = iInR;
g_que[g_qEnd][2] = iInC;
g_que[g_qEnd][3] = iStep + 1;
g_qEnd++;
g_flag[iInL-1][iInR][iInC] = true;
}
}
return ;
}
void init()
{
g_minStep = INT_MAX;
g_qHead = 0;
g_qEnd = 0;
memset(g_flag, 0, sizeof(g_flag));
char szRow[N+1] = {};
for(int i = 0; i < g_L; i++)
{
for(int j = 0; j < g_R; j++)
{
scanf("%s", szRow);
for(int k = 0; k < g_C; k++)
{
g_dun[i][j][k] = szRow[k];
if('S' == szRow[k])
{
g_stL = i;
g_stR = j;
g_stC = k;
}
}
}
}
}
int main()
{
//int take = ::GetTickCount();
//freopen("out47.txt", "w", stdout);
while(true)
{
scanf("%d %d %d", &g_L, &g_R, &g_C);
if(0 == g_L)
{
break;
}
init();
bfs(g_stL, g_stR, g_stC);
if(INT_MAX == g_minStep)
printf("Trapped!\n");
else
printf("Escaped in %d minute(s).\n", g_minStep);
}
//cout<<::GetTickCount() - take<<endl;
return 0;
}