嵊州普及Day1T2

题意:走迷宫。求走到a[n][n]需要多久。

考场上想的dfs,听老师说最多50分。代码懒得码了,知道是走迷宫就好。

正解:bfs,时间复杂度O(n)。

见代码:

复制代码
#include<iostream>
using namespace std;
int n,head=0,tail=3,a[1001][1001],h[10001],l[10001],t[10001];
int a1[5]={0,-1,1,0,0},a2[5]={0,0,0,-1,1};
int c1[5]={0,-1,-1,1,1},c2[5]={0,-1,1,-1,1}; 
int flag[1001][1001];
char s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
       for(int j=1;j<=n;j++)
       {
           cin>>s;
           a[i][j]=int(s)-int('A')+1;    
           if(a[i][j]==4)
           flag[i][j]=0x3f3f3f3f;
       }
    flag[1][1]=1;
    flag[1][n]=1;
    flag[n][1]=1;
    h[1]=1;
    h[2]=1;
    h[3]=n;
    l[1]=1;
    l[2]=n;
    l[3]=1; 
    while(head!=tail)
    {
        head++;
        int x=h[head],y=l[head];
        if(a[x][y]==1)
        {
            for(int i=1;i<=4;i++)
            {
                if(x+a1[i]>0&&x+a1[i]<=n&&y+a2[i]>0&&y+a2[i]<=n)
                {
                    if(flag[x+a1[i]][y+a2[i]]==0||flag[x+a1[i]][y+a2[i]]>flag[x][y]+1)
                    tail++;
                    h[tail]=x+a1[i];
                    l[tail]=y+a2[i];
                    flag[x+a1[i]][y+a2[i]]=flag[x][y]+1;
                }
            }
        }
        if(a[x][y]==2)
        {
            for(int i=1;i<=4;i++)
            {
                if(x+a1[i]*2>0&&x+a1[i]*2<=n&&y+a2[i]*2>0&&y+a2[i]*2<=n)
                {
                    if(flag[x+a1[i]*2][y+a2[i]*2]==0||flag[x+a1[i]*2][y+a2[i]*2]>flag[x][y]+1)
                    tail++;
                    h[tail]=x+a1[i]*2;
                    l[tail]=y+a2[i]*2;
                    flag[x+a1[i]*2][y+a2[i]*2]=flag[x][y]+1;
                }
            }
        }
        if(a[x][y]==3)
        {
            for(int i=1;i<=4;i++)
            {
                if(x+c1[i]>0&&x+c1[i]<=n&&y+c2[i]>0&&y+c2[i]<=n)
                {
                    if(flag[x+c1[i]][y+c2[i]]==0||flag[x+c1[i]][y+c2[i]]>flag[x][y]+1)
                    tail++;
                    h[tail]=x+c1[i];
                    l[tail]=y+c2[i];
                    flag[x+c1[i]][y+c2[i]]=flag[x][y]+1;
                }
            }
        }
    }
    if(a[n][n]==0)
    cout<<"GO to find Marx";
    else
    cout<<a[n][n];
    return 0;
}
复制代码

总而言之,相对简单的普及题。

好题哉!!!

posted @   青殇  阅读(113)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示