zoukankan      html  css  js  c++  java
  • [BFS] [NYNUOJ] 1154 找食物

    经典的BFS路长为一求最短路

    思路:

    先找钥匙 再找箱子

    两次BFS 

    未找到钥匙不可走箱子

    先把箱子变墙

    找到钥匙再恢复

    注意判重

    //#pragma GCC optimize(2)
    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #include <cmath>
    #include <cctype>
    #include <string>
    #include <cstring>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <set>
    #include <map>
    #include <ctime>
    #include <vector>
    #include <fstream>
    #include <list>
    #include <iomanip>
    #include <numeric>
    using namespace std;
    typedef long long ll;
     
    const int MAXN = 1010;
     
    char arr[1010][1010];
    
    int usea[MAXN][MAXN] = {0}, useb[MAXN][MAXN] = {0};
    
    ll n, m, ra, rb, ansa = 0, ansb = 0 , ta, tb;
    
    bool finda = false, findb = false;
     
    struct node
    {
        int x, y, step;
     
        node(int xa, int ya, int za)
        {
            x = xa;
            y = ya;
            step = za;
        }   
    };
     
    int movel[4][2] = { {1, 0}, {0, 1}, {-1, 0}, {0, -1} };
     
    queue <node> Q;
    
    queue <node> QB;
     
    void bfs(node a)
    {
        Q.push(a);
     
        while(!Q.empty())
        {
            node b = Q.front();
     
            Q.pop();
     
            if( !(b.x < 1 || b.x > n || b.y < 1 || b.y > m || arr[b.x][b.y] == '*' || usea[b.x][b.y] == 1) )
            {
            	usea[b.x][b.y] = 1;
            	
                if(arr[b.x][b.y] == 'S')
                {
                    finda = true;
    
                    ansa = b.step;
    
                    return ;
                }
                
                for(int i = 0; i < 4; i++)
                {
                    
                    Q.push(node(b.x + movel[i][0], b.y + movel[i][1], b.step + 1));
                }
            }
        }
    }
    
    void bfsb(node a)
    {
    	
        QB.push(a);
     
        while(!QB.empty())
        {
            node b = QB.front();
     
            QB.pop();
     
            if( !(b.x < 1 || b.x > n || b.y < 1 || b.y > m || arr[b.x][b.y] == '*' || useb[b.x][b.y] == 1) )
            {
            	useb[b.x][b.y] = 1;
                
    			if(arr[b.x][b.y] == 'T')
                {
                    findb = true;
    
                    ansb = b.step;
    
                    return ;
                }
                
                for(int i = 0; i < 4; i++)
                {
                    
                    QB.push(node(b.x + movel[i][0], b.y + movel[i][1], b.step + 1));
                }
            }
        }
    }
    
    int main()
    {
        ios::sync_with_stdio(false);
     
        cin.tie(0);     cout.tie(0);
     
        cin>>n>>m;
        
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= m; j++)
            {
                cin>>arr[i][j];
    
                if(arr[i][j] == 'T')
                {
                    arr[i][j] = '*';
    
                    ra = i;
                    rb = j;
                }
    
                if(arr[i][j] == 'S')
                {
                    ta = i;
                    tb = j;
                }
            }
        }
     
        int x, y;
     
        cin>>x>>y;
     
        node in(x, y, 0);
        
        bfs(in);
     
        arr[ra][rb] = 'T';
    
        if(finda)
        {
            node in(ta, tb, 0);
    
            bfsb(in);
        }
        
        if(finda && findb)
            cout<<ansa + ansb<<endl;
    
        else
            cout<<"-1"<<endl;
     
     
        return 0;
    }
    
  • 相关阅读:
    QQ 2006 正式版协议变动情况分析
    开源3D方面的软件
    要使silverlight能够在IIS中顺利运行,需要设置的东西.
    文本框回车自动提交
    No installed Service named "Apache2"
    Javascript:三个函数ceil()、floor()、round()的区别
    基于Apache的Svn服务器配置
    下载:HD AUDIO For XP SP3修正补丁
    ViewState在执行Refresh后丢失
    C#关闭应用程序时如何关闭子线程
  • 原文地址:https://www.cnblogs.com/zeolim/p/12270461.html
Copyright © 2011-2022 走看看