zoukankan      html  css  js  c++  java
  • UVa11624(逃离火焰问题)

    #include"cstdio"
    #include"queue"
    #include"cstring"
    using namespace std;
    const int MAXN=1005;
    const int INF=0X7fffffff;
    typedef pair<int,int> P;
    char mp[MAXN][MAXN];
    int ft[MAXN][MAXN];
    int jt[MAXN][MAXN];
    int dx[4]={1,0,-1,0};
    int dy[4]={0,1,0,-1};
    int n,m;
    int sy,sx;
    void bfs1()//第一次广搜确定 fire到达passable square的时间 
    {
        queue<P> que;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                ft[i][j]=INF;
                if(mp[i][j]=='F')
                {
                    que.push(P(i,j));
                    ft[i][j]=0;
                }    
            }
        while(!que.empty())
        {
            P now = que.front();que.pop();
            for(int i=0;i<4;i++)
            {
                int ny=now.first+dy[i];
                int nx=now.second+dx[i];
                if(0<=ny&&ny<n&&0<=nx&&nx<m&&mp[ny][nx]!='#')
                {
                    int dist=ft[now.first][now.second]+1;
                    if(dist<ft[ny][nx])
                    {
                        ft[ny][nx]=dist;
                        que.push(P(ny,nx));
                    }
                }
            }
        }
    }
    void bfs2()
    {
        memset(jt,-1,sizeof(jt));
        queue<P> que;
        que.push(P(sy,sx));
        jt[sy][sx]=0;
        while(!que.empty())
        {
            P now=que.front();que.pop();
            if(now.first==0||now.first==n-1||now.second==0||now.second==m-1)
            {
                printf("%d
    ",jt[now.first][now.second]+1);//逃出迷宫,注意+1 
                return ;
            }
            for(int i=0;i<4;i++)
            {
                int ny=now.first+dy[i];
                int nx=now.second+dx[i];
                if(0<=ny&&ny<n&&0<=nx&&nx<m&&mp[ny][nx]!='#'&&jt[ny][nx]==-1)
                {
                    int dist=jt[now.first][now.second]+1;
                    if(dist<ft[ny][nx])//若在该时刻该点没有火焰到达说明可行 
                    {
                        jt[ny][nx]=dist;
                        que.push(P(ny,nx));
                    }        
                }
            }
        }
        
        printf("IMPOSSIBLE
    ");
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            scanf("%*c");
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                {
                    scanf("%c",&mp[i][j]);
                    if(mp[i][j]=='J')
                    {
                        sy=i,sx=j;
                    }        
                }
                scanf("%*c");
            }
            bfs1();
            bfs2();
        }
        
        return 0;
    }
  • 相关阅读:
    DateTime.Now的精度这么高! (转)
    RC4经典加密算法VB版本代码
    反拍卖采购技术的应用
    用C#写 四舍五入函数(函数版)
    CRM(客户关系管理)
    给按钮增加属性
    用C#写 四舍五入函数(原理版)
    合并datagrid中内容相同的单元格(VB.Net)
    DataGrid删除确认及Item颜色交替
    得到目录大小
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5018308.html
Copyright © 2011-2022 走看看