• HDU 1026 Ignatius and the Princess I


    HDU 1026 Ignatius and the Princess I
    题意:给定一张图,X位置不能走,带数字的位置需要在该位置停留 '数字' 秒。然后回溯走的路程

    思路:BFS+回溯;


    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    typedef long long LL;
    typedef pair<int ,int > P;
    #define inf 0x3f3f3f3f
    struct node
    {
    	int x,y;
    };
    node pre[150][150];
    char mapp[150][150];
    int d[150][150];
    bool vis[150][150];
    int dx[5]={0,1,0,-1},
    	dy[5]={1,0,-1,0};
    int n,m;
    void BFS()
    {
    	memset(d,inf,sizeof(d));
    	queue<P> que;
    	que.push(P(0,0));
    	pre[0][0].x=-1;
    	pre[0][0].y=-1;
    	d[0][0]=0;
    	while(!que.empty())
    	{
    		P q=que.front();
    		que.pop();
    		for(int i=0; i<4; i++)
    		{
    			int nx=q.first+dx[i];
    			int ny=q.second+dy[i];
    			if(nx>=0 && nx<n && ny>=0 && ny<m && mapp[nx][ny]!='X')
    			{
    				if(mapp[nx][ny]=='.')
    				{
    					if(d[q.first][q.second]+1<d[nx][ny])
    					{
    						d[nx][ny]=d[q.first][q.second]+1;
    						pre[nx][ny].x=q.first;
    						pre[nx][ny].y=q.second;
    						que.push(P(nx,ny));
    					}
    				}
    				else
    				{
    					if(d[nx][ny]>d[q.first][q.second]+(mapp[nx][ny]-'0')+1)
    					{
    						d[nx][ny]=d[q.first][q.second]+(mapp	[nx][ny]-'0')+1;
    						pre[nx][ny].x=q.first;
    						pre[nx][ny].y=q.second;
    						que.push(P(nx,ny));
    					}
    				}
    			}
    		}
    	}
    }
        //路径回溯
    void  prinpath(int s,int t)
    {
    	if(pre[s][t].x==-1) return;
    	prinpath(pre[s][t].x,pre[s][t].y);
    	if(mapp[s][t]=='.')
    		printf("%ds:(%d,%d)->(%d,%d)
    ",d[s][t],pre[s][t].x,pre[s][t].y,s,t);
    	else
    	{
    		int num=mapp[s][t]-'0';
    		int k=d[s][t]-num;
    		printf("%ds:(%d,%d)->(%d,%d)
    ",k++,pre[s][t].x,pre[s][t].y,s,t);
    		for(int i=1; i<=num; i++)
    		printf("%ds:FIGHT AT (%d,%d)
    ",k++,s,t);
    	} 
    }
    int main()
    {
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    		memset(vis,0,sizeof(vis));
    		for(int i=0; i<n; i++)
    		{
    			scanf(" %s",mapp[i]);
    		}
    		BFS();
    		int ss=d[n-1][m-1];
    		if(ss==inf) printf("God please help our poor hero.
    ");
    		else{
    			printf("It takes %d seconds to reach the target position, let me show you the way.
    ",ss);
    			prinpath(n-1,m-1);
    		}
    		printf("FINISH
    ");
    	} 
    	return 0;
    }
  • 相关阅读:
    [NOIP2017]宝藏 子集DP
    [NOI2017]蔬菜 贪心
    hihoCoder#1698 : 假期计划 组合数
    KNIGHTS
    动态图连通性(线段树分治+按秩合并并查集)
    CF868F Yet Another Minimization Problem 分治决策单调性优化DP
    【POJ】【3308】Paratroopers
    【BZOJ】【3437】小P的牧场
    【BZOJ】【3156】防御准备
    【BZOJ】【1010】【HNOI2008】玩具装箱Toy
  • 原文地址:https://www.cnblogs.com/zzulipomelo/p/5284588.html
Copyright © 2020-2023  润新知