zoukankan      html  css  js  c++  java
  • UVA

     https://vjudge.net/problem/UVA-11624

    题意分析:

    一个人要逃离迷宫,迷宫的一些地方有火,每1分钟火会蔓延周围4块地板,人可以向4块地板移动,求人能逃出的最短时间,如果不能逃出,输出IMPOSSIBLE。

    解题思路:

    先一遍bfs遍历地板着火需要多少分钟,再一遍bfs遍历人能走的地方,如果,到达该地点的最短时间大于等于着火时间,那么这个地方就不能去,最后判断一下是不是来到了迷宫外面。

    #include <stdio.h>
    #include <algorithm>
    #include <queue>
    #include <string.h>
    using namespace std;
    #define N 1020
    char map[N][N];
    int book[N][N], F[N][N];
    
    struct edge {
    	int x;
    	int y;
    	int temp;
    }e;
    int nexts[4][2] = { 1,0, -1,0, 0,1, 0,-1 };
    queue<edge>q;
    int main()
    {
    	
    	int T, i, j, k, t, R, C, jx, jy, tx, ty, temp;
    	scanf("%d", &T);
    	while (T--)
    	{
    		memset(book, 0, sizeof(book));
    		memset(F, 0x3f, sizeof(F));
    		scanf("%d%d", &R, &C);
    		for (i = 0; i < R; i++)
    			scanf("%s", map[i]);
    		temp = 0;
    		for(i = 0; i < R; i++)
    			for(j = 0; j < C; j++)
    			{
    				if (map[i][j] == 'J')
    				{
    					jx=i;
    					jy=j;
    				}
    				if(map[i][j]=='F')
    				{
    					q.push({i, j, 0});
    					book[i][j]=1;
    				}
    			}
    		
    		while(!q.empty())
    		{
    			e=q.front();
    			q.pop();
    			F[e.x][e.y]=e.temp;
    		
    			for(i = 0; i < 4; i++)
    			{
    				tx = e.x;
    				ty = e.y;
    				
    				tx+=nexts[i][0];
    				ty+=nexts[i][1];
    				if(tx>=0 && ty>=0 && tx<R && ty<C)
    				{
    					if(map[tx][ty]!='#' && book[tx][ty]==0)
    					{
    						book[tx][ty]=1;
    						q.push({tx, ty, e.temp+1});
    					}
    				}
    			}
    		}
    		
    		memset(book, 0, sizeof(book));
    		q.push(edge{ jx, jy, 0 });
    		book[jx][jy] = 1;
    		temp = 0;
    		t=0;
    		while(!q.empty())
    		{
    			e=q.front();
    			q.pop();
    			for(i=0; i<4; i++)
    			{
    				tx=e.x+nexts[i][0];
    				ty=e.y+nexts[i][1];
    				if (tx < 0 || ty < 0 || tx >= R || ty >= C)
    				{
    					temp=1;
    					break;
    				}	
    			}
    			if(temp==1)
    				break;
    			for(i = 0; i < 4; i++)
    			{
    				tx=e.x;
    				ty=e.y;
    				tx+=nexts[i][0];
    				ty+=nexts[i][1];
    				if(tx>=0 && ty>=0 && tx<R && ty<C)
    				{
    					if(map[tx][ty]!='#' && map[tx][ty]!='F' && book[tx][ty]==0)
    					{
    						
    						if(e.temp+1<F[tx][ty])
    						{
    							q.push({tx, ty, e.temp+1});	
    							book[tx][ty]=1;
    						}
    							
    					} 
    				}
    			}
    		}
    		if(temp==1)
    			printf("%d
    ", e.temp+1);
    		else
    			printf("IMPOSSIBLE
    ");
    		while(!q.empty())
    			q.pop();
    	}
    	return 0;
    }
  • 相关阅读:
    java基础 ——String类型
    WinSCP密钥登录,实现文件上传
    linux 文件压缩,以及解压
    win10的资源管理器,边框不见了
    在360浏览器中打开表单,回显错误数据
    java返回数据工具类
    WEB工具类
    JSON 的几种转换
    二维码生成工具类
    XML的几种转换
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/11852598.html
Copyright © 2011-2022 走看看