zoukankan      html  css  js  c++  java
  • hdu 2364 Escape

    一个早上已经过了呀,迷宫问题已经做了好几道了呀,这题居然还要搞半天呀,一开始觉得用DFS直接一点,很好写,可是很果断的超时了,所以还是BFS了

    之后,题目要求不能回头,但是可能转多个弯之后又回到走过的点,但还是有可能过去的,因为可能是从不同方向移动到这个点,所以,所以用一个三维的数组记录每一个点的状态,每个点有五种状态,没走过,还有从四个方向中的一个方向移动到该点,vis[81][81][5](一开始开小了,直接挂了一次),注意到这一点之后,我想应该就不难A 了,但是敲代码过程中的细节问题还是很多的,具体看代码吧

    #include<iostream>
    #include<queue>
    using namespace std;
    int n,m,dir[5][2]={{0,0},{1,0},{0,1},{-1,0},{0,-1}};
    char map[81][81];
    bool vis[81][81][5];
    struct node
    {
    	int x,y,t,cnt;
    	node(int _x=0,int _y=0,int _t=0,int _cnt=0):x(_x),y(_y),t(_t),cnt(_cnt){}
    	friend bool operator <(const node &a,const node &b)
    	{
    		return a.cnt>b.cnt;
    	}
    };
    node f;
    priority_queue<node> Q;
    int bfs()
    {
    	Q.push(f);
    	while(!Q.empty())
    	{
    		node temp=Q.top();
    		Q.pop();
    		if(temp.x==0||temp.x==n-1||temp.y==0||temp.y==m-1)
    			return temp.cnt;
    		for(int k=1;k<5;k++)
    		{
    			int i=temp.x+dir[k][0];
    			int j=temp.y+dir[k][1];
    			if(!vis[i][j][k]&&map[i][j]!='#')
    			{
    			  if(temp.t%2==k%2)//k%2==1 表示方向为竖直方向,为0表示水平方向
    			  {
    				if(k==temp.t)//同一个方向时,看判断左右是否全为‘#’
    				{
    					if(k%2==0&&map[temp.x+1][temp.y]=='#'&&map[temp.x-1][temp.y]=='#')
    					{vis[i][j][k]=1; Q.push(node(i,j,k,temp.cnt+1));}
    					if(k%2==1&&map[temp.x][temp.y+1]=='#'&&map[temp.x][temp.y-1]=='#')
    					{vis[i][j][k]=1; Q.push(node(i,j,k,temp.cnt+1));}
    				}
    			  }
    			  else {vis[i][j][k]=1;Q.push(node(i,j,k,temp.cnt+1));} 
    			}
    		}
    	}
    	return -1;
    }
    
    int main()
    {
    	int cas,si,sj;
    	cin>>cas;
    	while(cas--)
    	{
    		while(!Q.empty())//想省点内存,可是结果对这题而言,差别不大呀
    			Q.pop();
    		cin>>n>>m;
    		for(int i=0;i<n;i++)
    		{
    			for(int j=0;j<m;j++)
    			{
    				cin>>map[i][j];
    				if(map[i][j]=='@')
    				{
    					si=i;sj=j;
    				}
    		
    			}
    		}
    		memset(vis,0,sizeof(vis));
    		f.x=si;f.y=sj;f.t=-1;f.cnt=0;
    		 cout<<bfs()<<endl;
    	}
    	return 0;
    }
    
    
    
  • 相关阅读:
    超贴心的,手把手教你写爬虫
    人生苦短我用Python,本文助你快速入门
    RocketMQ 安装
    RocketMQ 简介
    2020年工作上的最大收获——监控告警体系
    .NET Core开源任务调度平台ScheduleMaster上新了
    从源码角度分析ScheduleMaster的节点管理流程
    使用 K8s 进行作业调度实战分享
    图解 K8s 核心概念和术语
    深度剖析 Kafka Producer 的缓冲池机制【图解 + 源码分析】
  • 原文地址:https://www.cnblogs.com/nanke/p/2130889.html
Copyright © 2011-2022 走看看