求助,样例过不了,悬赏关注
查看原帖
求助,样例过不了,悬赏关注
648756
Shadow_Lord楼主2022/10/13 14:04
#include<bits/stdc++.h>
using namespace std;
const int N=110;
bool vis[N][N];
int m,n,a[N][N],sxx,syy,szz,f[N][N][4],xx[6]={1,-1,0,0},yy[6]={0,0,1,-1};
struct node{
    int sx,sy;
};
std::queue<node> q;
void sta()
{
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=m;j++)
        {
            a[i][j]=-1;
        }
    }
}
void sta2()
{
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]==-1)
            f[i][j][0]=f[i][j][1]=0x3f3f3f3f;
            else
            {
                f[i][j][2]=0x3f3f3f3f;
            }
        }
    }
}
void bfs(int hx,int hy)
{
    if(a[hx][hy]!=-1)
    {
        q.push(node{hx,hy});
        f[hx][hy][a[hx][hy]]=0;
    }
    else
    {
        q.push(node{hx,hy});
        f[hx][hy][1]=2;
        f[hx][hy][0]=2;
    }
    while(!q.empty())
    {
        int x=q.front().sx,y=q.front().sy;
        q.pop();
        vis[x][y]=1;
        for(int i=0;i<4;i++)
        {
            int dx=x+xx[i],dy=y+yy[i];
            if(dx<1||dx>m||dy<1||dy>m)continue;
            if(a[x][y]==-1)
            {
                if(a[dx][dy]==-1)
                {
                    if(f[dx][dy][0]<=f[x][y][0]+2)continue;
                    if(f[dx][dy][1]<=f[x][y][0]+3)continue;
                    if(f[dx][dy][0]<=f[x][y][1]+3)continue;
                    if(f[dx][dy][1]<=f[x][y][1]+2)continue;
                    f[dx][dy][0]=f[x][y][0]+2;
                    f[dx][dy][1]=f[x][y][0]+3;
                    f[dx][dy][0]=f[x][y][1]+3;
                    f[dx][dy][1]=f[x][y][1]+2;
                    q.push(node{dx,dy});
                }
                else
                {
                    if(a[dx][dy]==1)
                    {
                        if(f[dx][dy][2]<=f[x][y][1])continue;
                        if(f[dx][dy][2]<=f[x][y][0]+1)continue;
                        f[dx][dy][2]=f[x][y][1];
                        f[dx][dy][2]=f[x][y][0]+1;
                        q.push(node{dx,dy});
                    }
                    else
                    {
                        if(f[dx][dy][2]<=f[x][y][1]+1)continue;
                        if(f[dx][dy][2]<=f[x][y][0])continue;
                        f[dx][dy][2]=f[x][y][1]+1;
                        f[dx][dy][2]=f[x][y][0];
                        q.push(node{dx,dy});
                    }
                }
            }
            else
            {
                if(a[x][y]==1)
                {
                    if(a[dx][dy]==-1)
                    {
                        if(f[dx][dy][0]<=f[x][y][2]+3)continue;
                        if(f[dx][dy][1]<=f[x][y][2]+2)continue;
                        f[dx][dy][0]=f[x][y][2]+3;
                        f[dx][dy][1]=f[x][y][2]+2;
                        q.push(node{dx,dy});
                    }
                    else
                    {
                        if(a[dx][dy]==1)
                        {
                            if(f[dx][dy][2]<=f[x][y][2])continue;
                            f[dx][dy][2]=f[x][y][2];
                            q.push(node{dx,dy});
                        }
                        else
                        {
                            if(f[dx][dy][2]<=f[x][y][2]+1)continue;
                            f[dx][dy][2]=f[x][y][2]+1;
                            q.push(node{dx,dy});
                        }
                    }
                }
                else
                {
                    if(a[dx][dy]==-1)
                    {
                        if(f[dx][dy][0]<=f[x][y][2]+2)continue;
                        if(f[dx][dy][1]<=f[x][y][2]+3)continue;
                        f[dx][dy][0]=f[x][y][2]+2;
                        f[dx][dy][1]=f[x][y][2]+3;
                        q.push(node{dx,dy});
                    }
                    else
                    {
                        if(a[dx][dy]==1)
                        {
                            if(f[dx][dy][2]<=f[x][y][2]+1)continue;
                            f[dx][dy][2]=f[x][y][2]+1;
                            q.push(node{dx,dy});
                        }
                        else
                        {
                            if(f[dx][dy][2]<=f[x][y][2])continue;
                            f[dx][dy][2]=f[x][y][2];
                            q.push(node{dx,dy});
                        }
                    }
                }
            }
        }
    }
}
int main()
{
    cin>>m>>n;
    sta();
    for(int i=1;i<=n;i++)
    {
        cin>>sxx>>syy>>szz;
        a[sxx][syy]=szz;
    }
    sta2();
    bfs(1,1);
    if(!vis[m][m])
    {
    	cout<<"-1";
    }
    else
    if(a[m][m]==-1)
    {
        cout<<min(f[m][m][0],f[m][m][1]);
    }
    else
    {
        cout<<f[m][m][2];
    }
    return 0;
}
2022/10/13 14:04
加载中...