zoukankan      html  css  js  c++  java
  • (2015年郑州轻工业学院ACM校赛题) B迷宫

    这是个简单的广搜题,注意下一下细节都能写出来, 大多数人都少考虑了一点,就是 假如 我的起始点就有一个机关, 并且不是 1 号机关,

    这样的话是无结果的。不懂的可以测试一下代码下面的数据

    #include<stdio.h>
    #include<iostream>
    #include<stack>
    #include<queue>
    #include<math.h>
    #include<stdlib.h>
    #include<cstring>
    using namespace std;
    #define Max(a,b) (a>b?a:b)
    #define Min(a,b) (a<b?a:b)
    #define INF 0xfffffff
    #define maxn 110
    struct Point
    {
        int x, y, step;
    }B[maxn];
    char maps[maxn][maxn];
    bool vis[maxn][maxn];
    int dir[8][2] = { {-1,-1},{-1,1},{1,-1},{1,1},{-1,0},{1,0},{0,-1},{0,1}};
    int n, m, k;
    
    bool OK(Point P,int i,int End)
    {
        if(P.x >= 0 && P.x < n && P.y >= 0 && P.y < m && maps[P.x][P.y] != '#' && maps[P.x][P.y] <= End+'0'  && !vis[P.x][P.y])
        {
            if(i < 4)
            {
                if(i == 0 && maps[P.x+1][P.y] == '#' && maps[P.x][P.y+1] == '#')
                    return false;
                if(i == 1 && maps[P.x+1][P.y] == '#' && maps[P.x][P.y-1] == '#')
                    return false;
                if(i == 2 && maps[P.x-1][P.y] == '#' && maps[P.x][P.y+1] == '#')
                    return false;
                if(i == 3 && maps[P.x-1][P.y] == '#' && maps[P.x][P.y-1] == '#')
                    return false;
            }
            return true;
        }
    
        return false;
    }
    
    int BFS(int Star,int End)
    {
        Point P, Pn;
        queue<Point> Q;
    
        memset(vis, false, sizeof(vis));
    
        Q.push(B[Star]);
    
        if(B[End].x == B[0].x && B[End].y == B[0].y && End != 1)
            return -1;
    
        while( !Q.empty() )
        {
            P = Q.front();
            Q.pop();
    
            if(P.x == B[End].x && P.y == B[End].y)
                return P.step;
    
            for(int i=0; i<8; i++)
            {
                Pn.x = P.x + dir[i][0];
                Pn.y = P.y + dir[i][1];
                Pn.step = P.step + 1;
    
                if( OK(Pn,i, End) )
                {
                    vis[Pn.x][Pn.y] = true;
                    Q.push(Pn);
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        int T, i;
    
        cin >> T;
    
        while(T--)
        {
            cin >> n >> m >> k;
    
            for(i=0; i<n; i++)
                scanf("%s", maps[i]);
    
    
            for(i=0; i<=k; i++)
            {
                cin >> B[i].x >> B[i].y;
                B[i].x --, B[i].y --;
                B[i].step = 0;
                maps[B[i].x][B[i].y] = i + '0';
            }
            int ans, sum;
            ans = sum = 0;
    
            for(i=0; i<k; i++)
            {
                ans = BFS(i, i+1);
    
                if(ans == -1)
                    break;
    
                sum += ans;
            }
    
            if( k == i)
                printf("%d
    ", sum);
            else
                printf("-1
    ");
        }
        return 0;
    }
    
    /*
    
    3
    3 3 2
    ...
    #..
    ...
    1 1
    1 2
    1 1

    答案 -1
    */
  • 相关阅读:
    函数之形参与实参
    函数的介绍与方法
    生活如戏
    zabbix中的sql
    1
    1
    通过snmpwalk抓取设备端口的流量状况
    abc
    as
    网络质量IP获取脚本
  • 原文地址:https://www.cnblogs.com/chenchengxun/p/4443500.html
Copyright © 2011-2022 走看看