zoukankan      html  css  js  c++  java
  • hdu 1242 Rescue

    优先队列+广度搜索

    第一次优先队列,重载操作符不是我写的……………………

    代码,参考大牛的……

    ………………

    原来优先队列+BFS是这样滴

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<queue>
    using namespace std;
    char s[201][201];
    int n,m,vis[200][200],ans;
    int  dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
    bool es;
    struct node
    {   
    	int x,y,dis; 
    	node(int _x=0,int _y=0,int _dis=0):x(_x),y(_y),dis(_dis){};   //自动初始化
    	friend bool operator<(const node &a,const node & b) //重载操作符
    	{     
    		return a.dis>b.dis; 
    	}
    };
    	node f,e;
    void dfs()
    {
    	priority_queue <node> q;
    	f.dis=0;
    	q.push(f);
    	vis[f.x][f.y]=1;
    	while(!q.empty())
    	{
    		node t=q.top();
    		q.pop();
    		for(int k=0;k<4;k++)
    		{
    			int i=t.x+dir[k][1];
    			int j=t.y+dir[k][0];
    			if(i<=n&&i>0&&j<=m&&j>0&&!vis[i][j]&&s[i][j]!='#')
    			{
    				vis[i][j]=1;
    				if(s[i][j]=='x')
    					q.push(node(i,j,t.dis+2));
    				if(s[i][j]=='.')
    					q.push(node(i,j,t.dis+1));
    				if(s[i][j]=='a')
    				{
    					es=1;ans=t.dis+1;
    					return ;
    				}
    			}
    		}
    	}
    	return ;
    }
    int main()
    {
    	while(cin>>n>>m)
    	{
    		memset(vis,0,sizeof(vis));
    		for(int i=1;i<=n;i++)
    			for(int j=1;j<=m;j++)
    			{
    				cin>>s[i][j];
    				if(s[i][j]=='r')//找出起点
    				{f.x=i;f.y=j;}
    				else if(s[i][j]=='a')
    				{e.x=i;e.y=j;}
    			}
    			es=0;
    			dfs();
    		if(es)
    			cout<<ans<<endl;
    		else cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    【docker】更换挂载目录
    【设计】交互走查表
    MySQL常用字符串函数
    VIM_manual
    MySQL操作符
    基础SELECT实例
    MySQL字符集及校对规则的理解
    Linux命令之tar-rsync
    Linux-PATH_环境变量
    MySQL常用数据类型
  • 原文地址:https://www.cnblogs.com/nanke/p/2123211.html
Copyright © 2011-2022 走看看