• [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;
    }
    
  • 相关阅读:
    epoll精髓 C++ 技术中心 C++博客
    【找茬】split string 力为的技术博客 C++博客
    不谈技术~蛇年,我回来了!
    不说技术~希望所有人都好好的
    DDD~充血模型和失血模型
    基础才是重中之重~何为原子化操作
    DDD~概念中的DDD
    策略模式
    windows句柄和消息技术
    观察者模式2(observer)
  • 原文地址:https://www.cnblogs.com/zeolim/p/12270461.html
Copyright © 2020-2023  润新知