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;
}
原文地址:https://www.cnblogs.com/linliu/p/5391179.html