2 条题解

  • 0
    @ 2022-05-14 22:00:52

    #include <iostream>
    #include <cstdio>
    #include <queue>
    using namespace std;
    int m,n,d,dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
    bool vis[105][105][105],flag;
    char map[105][105];
    struct node
    {
    int x,y,cost,fly;
    /*node(int xx,int yy,int costt,int flyy)
    {
    x=xx;y=yy;cost=costt;fly=flyy;
    } */
    };
    queue<node> q;
    void bfs()
    {
    //q.push(node(1,1,0,d));
    q.push((node){1,1,0,d});
    vis[1][1][d]=true;
    while(!q.empty())
    {
    node cur=q.front();
    q.pop();
    if(cur.x==m && cur.y==n)
    {
    printf("%d\n",cur.cost);
    flag=true;
    break;
    }
    for(int i=0;i<4;i++)
    {
    int nx=cur.x+dx[i];
    int ny=cur.y+dy[i];
    if(nx>=1 && ny>=1 && nx<=m && ny<=n && map[nx][ny]=='P' && !vis[nx][ny][cur.fly])
    {
    q.push((node){nx,ny,cur.cost+1,cur.fly});
    vis[nx][ny][cur.fly]=true;
    }
    }
    for(int i=0;i<4;i++)
    {
    for(int j=2;j<=cur.fly;j++)
    {
    int nx=cur.x+j*dx[i];
    int ny=cur.y+j*dy[i];
    if(nx>=1 && ny>=1 && nx<=m && ny<=n && map[nx][ny]=='P' && !vis[nx][ny][cur.fly-j])
    {
    q.push((node){nx,ny,cur.cost+1,cur.fly-j});
    vis[nx][ny][cur.fly-j]=true;
    }
    }
    }
    }
    }
    int main()
    {
    //freopen("escape.in","r",stdin);
    //freopen("escape.out","w",stdout);
    scanf("%d%d%d",&m,&n,&d);
    for(int i=1;i<=m;i++)
    for(int j=1;j<=n;j++)
    cin>>map[i][j];
    bfs();
    if(flag==false) printf("impossible\n");
    return 0;
    }
    /*
    4 4 2
    PLLP
    PPLP
    PPPP
    PLLP

    5
    */

  • 0
    @ 2018-11-03 15:50:38

    #include<iostream>
    #include<fstream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    #define N 110
    #define D 110
    #define K 1000001
    const int dx[4]={1,0,0,-1};
    const int dy[4]={0,1,-1,0};
    int n,m,d;
    int a[N][N],v[N][N][D];
    int qx[K],qy[K],step[K],dis[K];
    char x;

    int read()
    {
    int s=0,k=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')k=-1;c=getchar();}
    while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
    return k*s;
    }

    int main()
    {
    //freopen("escape.in","r",stdin);
    //freopen("escape.out","w",stdout);

    m=read(),n=read(),d=read();

    for(int i=1;i<=m;i++)
    for(int j=1;j<=n;j++)
    {
    cin>>x;
    a[i][j]=int(x=='L');
    }

    int l=1,r=1;
    qx[1]=1,qy[1]=1,step[1]=0,v[1][1][0]=true;
    while(l<=r)
    {
    if(qx[l]==m&&qy[l]==n)
    {
    printf("%d\n",step[l]);
    return 0;
    }

    for(int i=0;i<4;i++)
    {
    for(int x=qx[l]+2*dx[i],y=qy[l]+2*dy[i],j=dis[l]+2;x>0&&x<=m&&y>0&&y<=n&&j<=d;x+=dx[i],y+=dy[i],j++)
    {
    if(v[x][y][j]||a[x][y])continue;
    qx[++r]=x,qy[r]=y,step[r]=step[l]+1,dis[r]=j,v[x][y][dis[r]]=true;
    }
    }

    for(int i=0;i<4;i++)
    {
    int x=qx[l]+dx[i],y=qy[l]+dy[i];
    if(x>0&&x<=m&&y>0&&y<=n)
    {
    if(v[x][y][dis[l]]||a[x][y])continue;
    qx[++r]=x,qy[r]=y,step[r]=step[l]+1,dis[r]=dis[l],v[x][y][dis[r]]=true;
    }
    }
    l++;
    }
    printf("impossible\n");
    return 0;
    }//没满分的solution!很low! ——一位没车没房没钱没女朋友没梦想最真实的Programer 凌寒舞

  • 1

信息

难度
8
分类
搜索 点击显示
标签
递交数
60
已通过
9
通过率
15%
被复制
1
上传者