zoukankan      html  css  js  c++  java
  • HDU1026_优先队列+广搜+打印路径

    题目大意: 给你一个地图,地图中有三种元素,“.”代表空地,“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
  • 相关阅读:
    [置顶] 大型网站技术架构(六)网站的伸缩性架构
    [置顶] 大型网站技术架构(五)网站高可用架构
    [置顶] 大型网站技术架构(五)网站高可用架构
    [置顶] 大型网站技术架构(四)网站的高性能架构
    [置顶] 大型网站技术架构(四)网站的高性能架构
    [置顶] 大型网站技术架构(三)架构核心要素
    [置顶] 大型网站技术架构(二)架构模式
    [置顶] 大型网站技术架构(二)架构模式
    [置顶] 大型网站技术架构(一)大型网站架构演化
    [置顶] 大型网站技术架构(一)大型网站架构演化
  • 原文地址:https://www.cnblogs.com/cchun/p/2520204.html
Copyright © 2011-2022 走看看