2018 焦作区域赛 F题(BFS)

题意:六边形迷宫

思路:BFS,注意初始化和数据范围,我卡了1h+在这上面(哭,还是经验不足

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
using namespace std;

#define ll long long
#define clr(a,b) memset(a,b,sizeof(a))

const int maxn=6e3+10;
const int inf=0x3f3f3f3f;

char mp[maxn][maxn];
int vis[maxn][maxn];
int r,c,cnt;
char tmp;
int cas,j;

int res;

int dirx[10]= {3, 3,-3,-3,0, 0};
int diry[10]= {1,-1,-1, 1,2,-2};
int dx[10]= {6, 6,-6,-6,0,0};
int dy[10]= {2,-2,-2, 2,4,-4};

struct node
{
    int x,y;
    int step=0;
};
node St,Et;
queue <node> que;

int bfs()
{
    que.push(St);
    node next;
    while(!que.empty())
    {
        node head=que.front();
        que.pop();
        if(head.x==Et.x &&head.y==Et.y)
            return head.step;
        for(int i=0; i<6; i++)
        {
            int tmpx=head.x+dirx[i];
            int tmpy=head.y+diry[i];
            int tx=head.x+dx[i];
            int ty=head.y+dy[i];
            if(mp[tmpy][tmpx]==' ' && tx>=1 && tx<=6*c+3 && ty>=1 && ty<=4*r+3 && !vis[ty][tx])
            {
                next.step=head.step+1;
                next.x=tx;
                next.y=ty;
                que.push(next);
                vis[ty][tx]=1;
              //  cout<<tx<<" "<<ty<<endl;
            }
        }
    }
    return -1;
}


int main()
{
    scanf("%d",&cas);
    while(cas--)
    {
        while(!que.empty())
            que.pop();

        scanf("%d%d",&r,&c);
        for(int i=0;i<=4*r+3;i++)
            for(int j=0;j<=6*c+3;j++)
            {
                mp[i][j]=' ';
                vis[i][j]=0;
            }

        cnt=0;
        for(int i=0; i<=4*r+3; i++)
        {
            cnt=0;
            while(1)
            {
                cnt++;
                tmp=getchar();
                if(tmp=='\n')
                    break;
                if(tmp=='S')
                {
                    St.step=1;
                    St.x=cnt;
                    St.y=i;
                    vis[i][cnt]=1;
                }
                if(tmp=='T')
                {
                    Et.x=cnt;
                    Et.y=i;
                }
                mp[i][cnt]=tmp;
            }
        }
        printf("%d\n",bfs());
    }
    return 0;
}

 

发布了18 篇原创文章 · 获赞 1 · 访问量 1731
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览