虫洞操纵者

文章目录


这个题是牛客周赛上的一道题
题目链接
在这里插入图片描述

思路

当时比赛的时候我就想起用BFS写但没有思路,然后看了别人写的才知道,就是我们一开始可以先把数组处理一下让数组异或1,异或之后0就变成可以走的路,1就变成了墙和边界,然后我们就正常的按BFS套路走,在每一个位置都遍历上下左右四个方向,如果遇见1就回溯直到再遇见下一个位置是1的点,如果这个点没有被遍历过就入队,直到找到(n,n)就行了。

代码

#include <bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int s[1010][1010],n,st[1010][1010],f=0;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
typedef pair<int,int>PII;
queue<PII>q;
void bfs(int x,int y)
{
    st[x][y]=0;
    q.push({x,y});
    while(q.size())
    {
        PII t=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int a=t.first+dx[i],b=t.second+dy[i];
            if(s[a][b]==0)
            {
                while(s[a-dx[i]][b-dy[i]])
                    a-=dx[i],b-=dy[i];
            }
            if(st[a][b]>-1)continue;
            q.push({a,b});
            st[a][b]=st[t.first][t.second]+1;
            if(a==n&&b==n)
            {
                f=1;break;
			}
        }
        if(f==1)
        break;
    }
}
signed main()
{
	IOS
	int T=1;
	cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cin>>s[i][j],s[i][j]^=1;
    }
    memset(st,-1,sizeof st);
    bfs(1,1);
    if(f==0)
    cout<<-1<<endl;
    else
    cout<<st[n][n]<<endl;
	return 0;
}
bugstack栈是一个以技术为核心的社群和知识分享平台。在这个平台上,程序员、软件开发者和技术爱好者可以交流、学习和分享各种与技术相关的话题和经验。 首先,bugstack栈提供了丰富多样的技术资源。在这个平台上,用户可以找到各种编程语言、开发框架和技术工具的教程、文档和案例。这些资源涵盖了从初级到高级的各个层次,无论你是刚入门的新手还是资深的专家,都可以在这里找到适合自己的学习材料。 其次,bugstack栈注重用户之间的交流和互动。用户可以在平台上发表自己的观点、经验和问题,与其他人进行讨论和互动。这种交流不仅可以加深自己对技术的理解和掌握,还可以结交到更多志同道合的朋友和同行,激发创新思维和解决问题的能力。 此外,bugstack栈还举办各种线上线下的技术活动。比如技术讲座、技术沙龙、技术峰会等。这些活动不仅给用户提供了进一步学习和分享的机会,还可以拓宽用户的视野,了解更多前沿的技术和行业趋势。 总之,bugstack栈是一个面向技术爱好者的社群平台,它提供了丰富多样的技术资源,注重用户之间的交流和互动,举办各种技术活动,为用户提供一个学习、交流和成长的平台。无论你是想学习新技术、解决问题,还是寻找合作伙伴或者拓展人脉,这个平台都是一个理想的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值