zoukankan      html  css  js  c++  java
  • hdu1026 Ignatius and the Princess I

    优先队列+BFS+保存路径

    额,先记录前驱,再用栈输出路径,其他的,都快成模板了,最近打得很熟,就是输出的时候,一些小错误改了半天ORZ

    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<stack>
    using namespace std;
    char map[101][101];
    int vis[101][101],n,m,mins;
    bool rescue;
    int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    struct node
    {
    	int x,y,cnt;
    	node(int _x=0,int _y=0,int _cnt=0):x(_x),y(_y),cnt(_cnt){};
    	friend bool operator <(const node &a, const node &b)
    	{
    		return a.cnt>b.cnt;
    	}
    };
    node f[101][101];
    void bfs()
    {
    	node t;
    	t.x=1;t.y=1;t.cnt=0;
    	priority_queue<node> Q;
    	Q.push(t);
    	vis[1][1]=1;
    	while(!Q.empty())
    	{
    		node b=Q.top();
    		Q.pop();
    		if(b.x==n&&b.y==m)
    		{
    			rescue=1;
    			mins=b.cnt;
    			return;
    		}
    		for(int k=0;k<4;k++)
    		{
    			int i=b.x+dir[k][0];
    			int j=b.y+dir[k][1];
    			if(i<=n&&i>0&&j<=m&&j>0&&!vis[i][j]&&map[i][j]!='X')
    			{
    				vis[i][j]=1;
    				f[i][j].x=b.x;f[i][j].y=b.y;f[i][j].cnt=b.cnt+1;//记录前驱
    				if(map[i][j]=='.')
    				Q.push(node(i,j,b.cnt+1));
    				else Q.push(node(i,j,b.cnt+(map[i][j]-'0')+1));
    			}
    		}
    	}
    }
    void print()
    {
    	stack<node> S;
    	node temp=f[n][m];
    	S.push(node(n,m,mins));
    	while(temp.x!=1||temp.y!=1)
    	{
    		S.push(temp);
    		temp=f[temp.x][temp.y];
    	}
    	int t=1;
    	while(!S.empty())
    	{
    		temp=S.top();
    		S.pop();
    		if(map[temp.x][temp.y]=='.')
    			printf("%ds:(%d,%d)->(%d,%d)\n",t++,f[temp.x][temp.y].x-1,f[temp.x][temp.y].y-1,temp.x-1,temp.y-1);
    		else {
    			printf("%ds:(%d,%d)->(%d,%d)\n",t++,f[temp.x][temp.y].x-1,f[temp.x][temp.y].y-1,temp.x-1,temp.y-1);
    			int k=map[temp.x][temp.y]-'0';
    			while(k--)
    				printf("%ds:FIGHT AT (%d,%d)\n",t++,temp.x-1,temp.y-1);
    			//printf("%ds:(%d,%d)->(%d,%d)\n",t++,temp.x,temp.y,S.top().x,S.top().y);
    		}
    	}
    	printf("FINISH\n");
    	return ;
    }
    
    int main()
    {
    	while(cin>>n>>m)
    	{
    		for(int i=1;i<=n;i++)
    		{
    			for(int j=1;j<=m;j++)
    				cin>>map[i][j];
    		}
    		memset(vis,0,sizeof(vis));
    		rescue=0;
    		bfs();
    		if(rescue) printf("It takes %d seconds to reach the target position, let me show you the way.\n",mins);
    		else 
    		{printf("God please help our poor hero.\nFINISH\n");continue;}
    		print();
    
    	}
    	return 0;
    }
    
  • 相关阅读:
    Redis02——Redis单节点安装
    Redis01——Redis产生背景
    验证元素的唯一性(二重循环法和快排优化)
    线性同余法的伪随机数
    转载(为啥要对10000007取模)
    (算法专题)使用常微分方程将递归转换为非递归
    算法设计与分析——习题一
    PAT Basic 1030 完美数列 (25 分)
    禁止yum update 自动更新系统内核
    Redis AOF 持久化方式
  • 原文地址:https://www.cnblogs.com/nanke/p/2125537.html
Copyright © 2011-2022 走看看