题目大意: 给你一个地图,地图中有三种元素,“.”代表空地,“x”代表墙,'1'->'9'代表怪兽,打怪兽的时间跟那个数字的时间是一致的。输入地图的长为c,宽为r,然后要求人从(0,0)走到(r-1,c-1),就是从地图的最左端走到最右端。求这个人的最短时间,还有打印出所走的路径。简单水题,唯一的亮点就是加上了一个打印路径。有点儿纠结~一开始 解题思路: 直接用优先队列+广搜搞,中途把点都放入一个map中,用二维数组来存放也可以,这里用了两种不同的方法,感觉用map,代码复杂度会低一点,但是时间复杂度可能更高。还有,用map要注意不要用原来的结构体,因为优先队列,原来的结构体排序上的运算符重载关系。存路径的时候,就是把下一个点的x,y作为二维数组的下标,然后当前点作为这个数组的值。结果就是,二维数组里面记录的是一个树,然后从末尾节点往回打印。就出现了一条路径了。要注意最后用栈让它按正常顺序打印出来。。 两种的时间都是15ms 代码:第一个代码用二维数组存路径
#include
#include
#include
#include
const int MAX=105;
const int inf=0x7fffffff;
using namespace std;
typedef struct node
{
	int x,y,step,next_x,next_y;
	friend bool operator<(const struct node &n1,const struct node &n2)
	{
		return n1.step>n2.step;
	}
}N;
char Map[MAX][MAX];
//N path[MAX*MAX];
//mappath;
N a_path[MAX][MAX];
stackpath_ans;
int r,c;//地图行、列
int vst[MAX][MAX];
bool visited[MAX][MAX];
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
N final_one;
int BFS(int sx,int sy)
{
	priority_queue Q;
	N pre,cur;
	pre.x=sx,pre.y=sy,pre.step=0;
	//visited[pre.x][pre.y]=true;
	vst[pre.x][pre.y]=1;
	Q.push(pre);
	while(!Q.empty())
	{
		pre=Q.top();
		Q.pop();
		if(pre.x==r-1 && pre.y==c-1)
		{
			final_one=pre;
			return pre.step;
		}
		for(int i=0;i<4;i++)
		{
			cur=pre;
			cur.x+=dir[i][0];
			cur.y+=dir[i][1];
			if(cur.x>=0 && cur.x=0 && cur.y'0' && Map[cur.x][cur.y]<='9')
					cur.step+=Map[cur.x][cur.y]-'0'+1;
				//visited[cur.x][cur.y]=true;
				if(cur.step"<'0' && Map[cur.x][cur.y]<='9')
			for(int i=0;i(%d,%d)\n",time++,cur.x,cur.y,cur.next_x,cur.next_y);
	}
	printf("FINISH\n");
}
void init()
{
	memset(visited,false,sizeof(visited));
	for(int i=0;i

第二个代码(用map存放路径):
#include
#include
#include
#include
const int MAX=105;
const int inf=0x7fffffff;
using namespace std;
typedef struct node
{
	int x,y,step,next_x,next_y;
	friend bool operator<(const struct node &n1,const struct node &n2)
	{
		return n1.step>n2.step;
	}
}N;

typedef struct path
{
	int x,y,next_x,next_y;
	friend bool operator<(const struct path &n1,const struct path &n2)
	{
		if(n1.x>n2.x)
			return true;
		else if(n1.x==n2.x)
		{
			if(n1.y>n2.y)
				return true;
			else
				return false;
		}
		else
			return false;
	}
}Pa;

char Map[MAX][MAX];
//N path[MAX*MAX];
mappath_map;
stackpath_ans;
int r,c;//地图行、列
int vst[MAX][MAX];
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
Pa final_one;
int BFS(int sx,int sy)
{
	priority_queue Q;
	N pre,cur;
	pre.x=sx,pre.y=sy,pre.step=0;
	//visited[pre.x][pre.y]=true;
	vst[pre.x][pre.y]=1;
	Q.push(pre);
	while(!Q.empty())
	{
		pre=Q.top();
		Q.pop();
		if(pre.x==r-1 && pre.y==c-1)
		{
			final_one.x=pre.x;
			final_one.y=pre.y;
			return pre.step;
		}
		for(int i=0;i<4;i++)
		{
			cur=pre;
			cur.x+=dir[i][0];
			cur.y+=dir[i][1];
			if(cur.x>=0 && cur.x=0 && cur.y'0' && Map[cur.x][cur.y]<='9')
					cur.step+=Map[cur.x][cur.y]-'0'+1;
				//visited[cur.x][cur.y]=true;
				if(cur.step"<'0' && Map[cur.x][cur.y]<='9')
			for(int i=0;i(%d,%d)\n",time++,cur.x,cur.y,cur.next_x,cur.next_y);
	}
	printf("FINISH\n");
}
void init()
{
	
	for(int i=0;i
posted on 2011-12-07 17:02  cchun  阅读(279)  评论(0编辑  收藏  举报