poj 2935

7 篇文章 0 订阅
使用广度优先搜索,可以找到最短路径,比较经典的迷宫问题。
#include <iostream>
using namespace std;

const int maxn = 15;//将地图扩展
struct {
	int row;
	int col;
	int pre;//父指针
	int dir;//方向
}thend,que[50];

bool map[maxn][maxn];//墙为true,访问过为true
bool hasfind;//
int lp,rp;//队列首尾指针

char trans(int w)
{
	if(0==w) return 'N';
	if(1==w) return 'W';
	if(2==w) return 'E';
	if(3==w) return 'S';
}

int dr[4] = {-2,0,0,2};
int dc[4] = {0,-2,2,0};//相应的为 北西东南

bool in_range(int r,int c)//判断是否超出地图
{
	if(r >= 0 && r <= 12 && c >= 0 && c <= 12)
		return true;
	return false;
}

bool crosswall(int r,int c,int w)//判断是否穿过墙
{
	if(0==w) return map[r + 1][c];
	if(1==w) return map[r][c + 1];
	if(2==w) return map[r][c - 1];
	if(3==w) return map[r - 1][c];
}


void init(int sr,int sc)
{
	memset(map,false,sizeof(map));
	//边界上围墙
	for(int i = 0;i <= 12;i++)
		map[0][i] = true;
	for(int i = 0;i <= 12;i++)
		map[i][0] = true;
	for(int i = 0;i <= 12;i++)
		map[i][12] = true;
	for(int i = 0;i <= 12;i++)
		map[12][i] = true;

	sr = sr * 2 - 1;
	sc = sc * 2 - 1;

	cin>>thend.col>>thend.row;
	thend.row = thend.row * 2 -1;
	thend.col = thend.col * 2 -1;

	int tr,tc,wr,wc;
	for(int i = 0;i < 3;i++)
	{
		cin>>tc>>tr>>wc>>wr;
		tr *= 2;
		tc *= 2;
		wr *= 2;
		wc *= 2;

		if(tc==wc)//水平方向 造墙
		{
			for(int st = tr;st <= wr;st++)
				map[st][tc] = true;
		}
		else
		{
			for(int st = tc;st <= wc;st++)
				map[tr][st] = true;
		}
	}//for int
	que[0].row = sr;
	que[0].col = sc;
	que[0].pre  = 0;//没有前驱
	que[0].dir = -1;

	hasfind = false;
	lp = 0,rp = 1;
}//init


void bfs()
{
	int tr,tc;
	lp = 0;
	rp = 1;
	map[que[lp].row][que[lp].col ] = true;
	while(!hasfind)
	{
		//依次添加 四个儿子结点
		for(int i = 0;i < 4;i++)
		{
			tr = que[lp].row + dr[i];
			tc = que[lp].col + dc[i];
			if(in_range(tr,tc) && !crosswall(tr,tc,i) && !map[tr][tc])
			{
				map[tr][tc] = true;//结点已访问过
				que[rp].row = tr;
				que[rp].col = tc;
				que[rp].pre = lp;
				que[rp].dir = i;
				if(tr==thend.row && tc==thend.col)
				{
					hasfind = true;
					break;
				}
				rp++;
			}
		}
		lp++;
	}//while !find
}

void print(int k)
{
	if(0==k)
		return;
	else
	{
		print(que[k].pre);
		cout<<trans(que[k].dir);
	}
}

int main()
{
	freopen("in.txt","r",stdin);
	freopen("out.txt","w",stdout);
	int sr,sc;
	cin>>sc>>sr;
	while(sr || sc)
	{
		init(sr,sc);
		bfs();
		print(rp);
		cout<<endl;
		cin>>sc>>sr;
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值