• 2015轻院校赛 B 迷宫 (bfs)


    http://acm.zznu.edu.cn/problem.php?id=1967

    这套题的有毒   我交了好多遍才对

    坑:机关要按照顺序走 并且在走这个机关之前不能走这个机关  但是能穿过这个机关   所以不能把机关刚开始设成墙

    要设成其他符号

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <cstdio>
    #include <cstdlib>
    #include <cctype>
    #include <cmath>
    
    using namespace std;
    #define memset(a,b) memset(a,b,sizeof(a))
    #define N 110
    
    struct node
    {
        int x,y,step;
    }e[N];
    
    char maps[N][N];
    int n,m;
    int dis[8][2]={{1,0},{-1,0},{0,1},{0,-1},{-1,-1},{1,1},{-1,1},{1,-1}};
    int vis[N][N];
    
    int IF(int x,int y,int nx,int ny,int k)
    {
        if(maps[x][y]=='*' || maps[x][y]=='#' || x<0 || x>=n || y<0 || y>=m || vis[x][y]==1)
            return 0;
        if(k>=4)
        {
            if(k==4)
            {
                if(maps[x][y+1]=='#'&&maps[x+1][y]=='#')
                    return 0;
            }
            if(k==5)
            {
                if(maps[x][y-1]=='#' && maps[x-1][y]=='#')
                    return 0;
            }
            if(k==6)
            {
                if(maps[x][y-1]=='#' && maps[x+1][y]=='#')
                    return 0;
            }
            if(k==7)
            {
                if(maps[x][y+1]=='#' && maps[x-1][y]=='#')
                    return 0;
            }
        }
        return 1;
    }
    
    int bfs(node s,node o)
    {
        memset(vis,0);
        queue <node>Q;
        Q.push(s);
        vis[s.x][s.y]=1;
        while(Q.size())
        {
            node p,q;
            p=Q.front();
            Q.pop();
            if(p.x==o.x && p.y==o.y)
                return p.step;
            for(int i=0;i<=7;i++)
            {
                q.x=p.x+dis[i][0];
                q.y=p.y+dis[i][1];
                if(IF(q.x,q.y,p.x,p.y,i)==1)
                {
                    q.step=p.step+1;
                    Q.push(q);
                    vis[q.x][q.y]=1;
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        int T,k;
        scanf("%d",&T);
        while(T--)
        {
            int flag=0;
            scanf("%d %d %d",&n,&m,&k);
            for(int i=0;i<n;i++)
            {
                scanf("%s",maps[i]);
            }
            for(int i=0;i<=k;i++)
            {
                scanf("%d %d",&e[i].x,&e[i].y);
                e[i].step=0;
                if(i!=0 && i!=1)
                {
                    if(e[i].x==e[0].x && e[i].y==e[0].y)
                        flag=1;
                }
            }
            if(flag==1)
            {
                printf("-1
    ");
                continue;
            }
            int ans=0,sum=0;;
            for(int i=1;i<=k;i++)
            {
                for(int j=i+1;j<=k;j++)
                {
                    maps[e[j].x-1][e[j].y-1]='*';
                }
                node S,E;
                S.x=e[i-1].x-1;
                S.y=e[i-1].y-1;
                S.step=0;
                E.x=e[i].x-1;
                E.y=e[i].y-1;
                E.step=0;
                ans=bfs(S,E);
                if(ans==-1)
                {
                    sum=-1;
                    break;
                }
                else
                    sum+=ans;
                for(int j=i+1;j<=k;j++)
                {
                    maps[e[j].x-1][e[j].y-1]='.';
                }
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
  • 相关阅读:
    算法:二分图最大独立集
    算法:桶排序
    算法:二分图最小点覆盖——Konig定理
    jQuery基础整理之思维导图
    vue基础知识整理
    HTML总结
    JAVAScript总结
    栈和队列
    今日学习遇到的问题(2018.9.23)
    看了vue文档之后。。。。
  • 原文地址:https://www.cnblogs.com/linliu/p/5391179.html
Copyright © 2020-2023  润新知