zoukankan      html  css  js  c++  java
  • HDU 1175 连连看 BFS

    搞法和上面那个逃离迷宫差不多,细节要处理好,蛋疼了好久QAQ

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <map>
    #include <set>
    #include <vector>
    #include <string>
    #include <queue>
    #include <deque>
    #include <bitset>
    #include <list>
    #include <cstdlib>
    #include <climits>
    #include <cmath>
    #include <ctime>
    #include <algorithm>
    #include <stack>
    #include <sstream>
    #include <numeric>
    #include <fstream>
    #include <functional>
    
    using namespace std;
    
    #define MP make_pair
    #define PB push_back
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef vector<int> VI;
    typedef pair<int,int> pii;
    const int INF = INT_MAX / 3;
    const double eps = 1e-8;
    const LL LINF = 1e17;
    const double DINF = 1e60;
    const int maxn = 1005;
    const int mod = maxn * 200;
    const int dx[] = {0,0,1,-1};
    const int dy[] = {1,-1,0,0};
    int mp[maxn][maxn];
    int dk[maxn][maxn];
    int n,m,q;
    
    void bfs(int x1,int y1) {
        queue<int> qx,qy;
        qx.push(x1); qy.push(y1);
        dk[x1][y1] = 0;
        bool first = true;
        while(!qx.empty()) {
            int x = qx.front(), y = qy.front();
            qx.pop(); qy.pop();
            first = false;
            for(int i = 0;i < 4;i++) {
                int nx = x + dx[i], ny = y + dy[i];
                while(mp[nx][ny] == 0  && dk[x][y] < 3 && dk[nx][ny] >= dk[x][y] + 1) {
                    dk[nx][ny] = dk[x][y] + 1;
                    qx.push(nx); qy.push(ny);
                    if(mp[nx][ny] == mp[x1][y1]) break;
                    nx += dx[i]; ny += dy[i];
                }
                if(mp[nx][ny] == mp[x1][y1]) {
                    dk[nx][ny] = min(dk[nx][ny],dk[x][y] + 1);
                }
            }
        }
    }
    
    int main() {
        while(scanf("%d%d",&n,&m), n) {
            memset(mp,-1,sizeof(mp));
            for(int i = 1;i <= n;i++) {
                for(int j = 1;j <= m;j++) {
                    scanf("%d",&mp[i][j]);
                }
            }
            scanf("%d",&q);
            for(int i = 0;i < q;i++) {
                int x1,y1,x2,y2;
                bool pok = false;
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                if(mp[x1][y1] != mp[x2][y2]  || mp[x1][y1] == 0) {
                    puts("NO"); continue;
                }
                memset(dk,0x3f,sizeof(dk));
                int inf = dk[0][0];
                bfs(x1,y1);
                if(dk[x2][y2] <= 3) puts("YES");
                else puts("NO");
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    win10 uwp 弹起键盘不隐藏界面元素
    win10 uwp 存放网络图片到本地
    win10 uwp 存放网络图片到本地
    sublime Text 正则替换
    sublime Text 正则替换
    win10 uwp 绘图 Line 控件使用
    win10 uwp 绘图 Line 控件使用
    AJAX 是什么?
    什么是 PHP SimpleXML?
    PHP XML DOM:DOM 是什么?
  • 原文地址:https://www.cnblogs.com/rolight/p/3931817.html
Copyright © 2011-2022 走看看