hdu 1253

7 篇文章 0 订阅

这道题纯bfs,但是第一次交的时候tle ==,最后看其他人博客发现用a + b + c - 3  > limit 作为剪枝条件能节省不少时间,另外就是出口可能也是‘墙’,那么同样无法逃脱==。

#include <iostream>
#include <queue>
#include <memory.h>
#include <cstdlib>
using namespace std;

const int maxn = 50 + 5;

int step[maxn][maxn][maxn];
bool castle[maxn][maxn][maxn];
int level,row,col,limit;

struct position
{
	int L,R,C;
};
queue< position> que;
position start,dest;
bool escape;

bool in_range(position pos)
{
	if(pos.L >= 0 && pos.L < level && pos.R >= 0 && pos.R < row && pos.C >= 0 && pos.C < col)
		return true;
	return false;
}

position makepath(position pos,int mod)
{
	position npos = pos;
	switch(mod)
	{
	case 1:npos.R--;break;
	case 2:npos.C++;break;
	case 3:npos.R++;break;
	case 4:npos.C--;break;
	case 5:npos.L--;break;
	case 6:npos.L++;break;
	}
	return npos;
}

void init()
{
	memset(step,0,sizeof(step));
	memset(castle,true,sizeof(castle));
	start.C = start.R  = start.L = 0;
	int tmp;
	scanf("%d%d%d%d",&level,&row,&col,&limit);
	dest.C = col - 1;
	dest.R = row - 1;
	dest.L = level - 1; 
	escape = false;

	while(!que.empty())
		que.pop();

	for(int i = 0;i < level;i++)
	{
		for(int j = 0;j < row;j++)
		{
			for(int k = 0;k < col;k++)
			{
				scanf("%d",&tmp);
				if(1==tmp)
					castle[i][j][k] = false;
			}
		}//for int j
	}//for int i
}

void bfs()
{
	position parent,son;
	que.push(start);
	castle[start.L][start.R][start.C] = false;
	bool flag = true;

	while(!que.empty() && flag)
	{
		parent = que.front();
		que.pop();
		
		if(parent.L==dest.L && parent.R==dest.R && parent.C==dest.C)
		{
			escape = true;
			break;
		}

		for(int i = 1;i <= 6;i++)
		{
			son = makepath(parent,i);
			if(step[parent.L][parent.R][parent.C] > limit)
			{
				flag = false;
				break;
			}

			if(in_range(son) && castle[son.L][son.R][son.C])
			{
				castle[son.L][son.R][son.C] = false;
				step[son.L][son.R][son.C] = step[parent.L][parent.R][parent.C] + 1;
				que.push(son);
			}
		}
	}//while

	if(escape && step[dest.L][dest.R][dest.C] <= limit)
		printf("%d\n",step[dest.L][dest.R][dest.C]);
	else
		printf("-1\n");
}

int main()
{
	freopen("in.txt","r",stdin);
	freopen("out.txt","w",stdout);

	int casenum;
	scanf("%d",&casenum);
	while(casenum--)
	{
		init();
		if(level + row + col - 3 > limit)
			printf("-1\n");
		else if(castle[level-1][row-1][col-1]==false) 
		{
			printf("-1\n");
			continue;
		}
		else
			bfs();
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值