POJ2251 3D地图(BFS)



 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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值