题意:就是很简单路径寻找 然后而外的要求是打印出任意一条最短的路径 然后真是太爽了 在不明题意的情况下乱写
解法 直接上bfs 每一个点最多只经过一次 然后标记为-1就可以了 只要代码没有什么问题就可以了
反而起点的选择不是很重要 如果要把真正的起点当作起点的话 也是可以的 具体做法就是再从终点开始找出一条路径上的点 然后加进一个stack里面就可以了
真是太桑心了 本来是奔着一血去的 然后坑了全场 T了4发写大摸你的滚粗了
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int dir[3][4]={{0,1,2,3},{1,2,3,0},{3,0,1,2}};
struct node{
int x,y;
node (int x=0,int y=0):x(x),y(y){}
}e[888888];
int m,n,mind[888][888];
char mp[888][888],dc[3]={'F','L','R'};
int main(){
scanf("%d%d",&n,&m);
getchar();
memset(mp,0,sizeof mp);
for(int i=1;i<=2*n-1;++i){
gets(mp[i]+1);
}
for(int i=0;i<=2*n;++i)
for(int j=0;j<=2*m;++j)mind[i][j]=-1;
// for(int i=1;i<=2*n-1;++i){
// for(int j=1;j<=2*m-1;++j)
// printf("%c",city[i][j]);
// printf("\n");
// }
queue<node>q;
mind[1][2*m-1]=0;
q.push(node(1,2*m-1));
node now,nxt;
while(!q.empty()){
int x=q.front().x,y=q.front().y;q.pop();
for(int i=0;i<4;++i){
int xx=x+dx[i],yy=y+dy[i];
if(mp[xx][yy]=='-'||mp[xx][yy]=='|'){
// printf("%d %d\n",xx,yy);
xx+=dx[i];
yy+=dy[i];
// printf("%d %d\n\n",xx,yy);
if(mind[xx][yy]==-1){
// printf("in:%d %d\n",xx,yy);
mind[xx][yy]=mind[x][y]+1;
q.push(node(xx,yy));
}
}
}
}
// for(int i=1;i<=2*n-1;++i){
// for(int j=1;j<=2*m-1;++j)printf("%d ",mind[i][j]);
// printf("\n");
// }
int d;
// printf("%c %d\n",city[2*n-2][1],mind[2*n-3][1]);
// printf("%c %d\n",city[2*n-1][2],mind[2*n-1][3]);
if(mp[2*n-2][1]=='|'&&mind[2*n-3][1]==mind[2*n-1][1]-1){
puts("N");now.x=2*n-3,now.y=1,d=2;
}else if(mp[2*n-1][2]=='-'&&mind[2*n-1][3]==mind[2*n-1][1]-1){
puts("E");now.x=2*n-1,now.y=3;d=1;
}
while(1){
int x=now.x,y=now.y;
if(mind[x][y]==0){printf("\n");break;}
for(int k=0;k<3;++k){
int xx=x+dx[dir[k][d]];
int yy=y+dy[dir[k][d]];
if(mp[xx][yy]=='-'||mp[xx][yy]=='|'){
xx+=dx[dir[k][d]];yy+=dy[dir[k][d]];
if(mind[xx][yy]==mind[x][y]-1){
now.x=xx,now.y=yy;
d=dir[k][d];
printf("%c",dc[k]);
break;
}
}
}
}
return 0;
}