2 条题解
-
0gxf666 LV 3 @ 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
PLLP5
*/ -
02018-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