hdu 1254 推箱子(广搜)

题目链接:

代码:

#include<iostream>
#include<stdlib.h>
#include<cstring>
#include<queue>
using namespace std;
#define INF 10000000
struct man_box//将人和箱子的坐标定义在同一个结构体中
{
	int x,y;
	int bx,by;
	int step;
};
int q[4][2]={1,0,-1,0,0,1,0,-1};
int hash1[10][10][10][10];
int maze[10][10];
int row,rank1,minm;
man_box start;
int bfs()
{
	int i;
	minm=INF;
	man_box now,next,boxnext;
	queue<man_box>Q;
	Q.push(start);
	while(!Q.empty())
	{
		now=Q.front();
		Q.pop();
		for(i=0;i<4;i++)
		{
			next.x=now.x+q[i][0];//在周围的四个方向进行搜索
			next.y=now.y+q[i][1];
			next.step=now.step;
			next.bx=now.bx;
			next.by=now.by;
			if(maze[next.x][next.y]==1)//人碰到墙要停止
				continue;
			if(next.x<0||next.x>=row||next.y<0||next.y>=rank1)//人走出边界要停止
				continue;
			if(hash1[next.x][next.y][next.bx][next.by]<=now.step)//该点已经走过,不能再走
				continue;
			if(next.x==now.bx&&next.y==now.by)//人走到箱子的位置
			{
				next.bx=now.bx+q[i][0];
				next.by=now.by+q[i][1];
				next.step=now.step+1;
			    if(maze[next.bx][next.by]==3)//到达终点
				{
					if(next.step<minm)//找走的步数少的
						minm=next.step;
				}
				if(maze[next.bx][next.by]==1)//箱子被推倒墙边
					continue;
				if(next.bx<0||next.bx>=row||next.by<0||next.by>=rank1)//箱子出边界
					continue;
				hash1[next.x][next.y][next.bx][next.by]=next.step;//记录下走到该点时所走的步数
			}
			else
				hash1[next.x][next.y][next.bx][next.by]=now.step;
			Q.push(next);//将next推入队列之中
		}
	}
	return minm;
}

int main(void)
{
	int i,j,s,T,i1,i2,i3,i4;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&row,&rank1);
		for(i1=0;i1<10;i1++)
			for(i2=0;i2<10;i2++)
				for(i3=0;i3<10;i3++)
					for(i4=0;i4<10;i4++)
						hash1[i1][i2][i3][i4]=INF;//对hash进行初始化
		for(i=0;i<row;i++)
			for(j=0;j<rank1;j++)
			{
				scanf("%d",&maze[i][j]);
				if(maze[i][j]==4)//找到人的起点
				{
					start.x=i;
					start.y=j;
				}
				if(maze[i][j]==2)//找到箱子的起点
				{
					start.bx=i;
					start.by=j;
					start.step=0;
				}
			}
			hash1[start.x][start.y][start.bx][start.by]=0;//对起点进行初始化
			s=bfs();
			if(s==INF)
				printf("-1\n");
			else
				printf("%d\n",s);
			memset(maze,0,sizeof(maze));
	}
	system("Pause");
	return 0;
}


 

你可能感兴趣的:(hdu 1254 推箱子(广搜))