解题思路:运用BFS求解最短路径,定义结构体记录前一个节点,最后递归打印结果。使用方法比较复杂,代码量很大,实际可以不用这么麻烦,后面有时间会认真参考刘汝佳老师的方法!
大体题意:
有一个最多9*9个点的迷宫, 给定起点坐标(r0,c0)和终点坐标(rf,cf), 求出最短路径并输出。
#include<cstdio>
#include<iostream>
#include<queue>
#include<string>
#include<sstream>
#include<string.h>
using namespace std;
struct p
{
int prex,prey;
int x,y;
string s;
}maze[10][10];
bool mark[10][10]; //因为是BFS,每个点应该只走一次,用该数组记录某个点是否走过。
bool ans=false;
int sx,sy,ex,ey;
queue<p> Q;
int go[4][2]=
{
1,0,
-1,0,
0,1,
0,-1
};
void BFS()
{
while(Q.empty()==false)
{
p tmp=Q.front();
Q.pop();
stringstream ss(tmp.s);
string str;
while(ss>>str)
{
if(str[0]=='*') break;
for(int i=1;i<str.length();i++)
{
if(str[0]=='N')
{
if(str[i]=='L')
{
int nx=tmp.x+go[3][0];
int ny=tmp.y+go[3][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
else if(str[i]=='R')
{
int nx=tmp.x+go[2][0];
int ny=tmp.y+go[2][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
else if(str[i]=='F')
{
int nx=tmp.x+go[1][0];
int ny=tmp.y+go[1][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
}
else if(str[0]=='S')
{
if(str[i]=='L')
{
int nx=tmp.x+go[2][0];
int ny=tmp.y+go[2][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
else if(str[i]=='R')
{
int nx=tmp.x+go[3][0];
int ny=tmp.y+go[3][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
else if(str[i]=='F')
{
int nx=tmp.x+go[0][0];
int ny=tmp.y+go[0][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
}
else if(str[0]=='E')
{
if(str[i]=='L')
{
int nx=tmp.x+go[1][0];
int ny=tmp.y+go[1][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
else if(str[i]=='R')
{
int nx=tmp.x+go[0][0];
int ny=tmp.y+go[0][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
else if(str[i]=='F')
{
int nx=tmp.x+go[2][0];
int ny=tmp.y+go[2][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
}
else if(str[0]=='W')
{
if(str[i]=='L')
{
int nx=tmp.x+go[0][0];
int ny=tmp.y+go[0][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
else if(str[i]=='R')
{
int nx=tmp.x+go[1][0];
int ny=tmp.y+go[1][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
else if(str[i]=='F')
{
int nx=tmp.x+go[3][0];
int ny=tmp.y+go[3][1];
if(nx<1||nx>9||ny<1||ny>9) continue;
if(mark[nx][ny]==true) continue;
mark[nx][ny]=true;
maze[nx][ny].prex=tmp.x;
maze[nx][ny].prey=tmp.y;
if(nx==ex&&ny==ey)
{
ans=true;
return;
}
Q.push(maze[nx][ny]);
}
}
}
}
}
}
void print(int x,int y) //递归打印结果
{
//cout<<"("<<x<<","<<y<<")"<<" ";
if(maze[x][y].prex!=0||maze[x][y].prey!=0)
print(maze[x][y].prex,maze[x][y].prey);
cout<<"("<<x<<","<<y<<")"<<" ";
return;
}
int main()
{
string name;
while(cin>>name)
{
if(name=="END") break;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
maze[i][j].x=i;
maze[i][j].y=j;
maze[i][j].prex=maze[i][j].prey=0;
}
}
char dir;
cin>>sx>>sy>>dir>>ex>>ey;
if(dir=='N')
{
maze[sx-1][sy].prex=sx;
maze[sx-1][sy].prey=sy;
sx-=1;
}
else if(dir=='S')
{
maze[sx+1][sy].prex=sx;
maze[sx+1][sy].prey=sy;
sx+=1;
}
else if(dir=='W')
{
maze[sx][sy-1].prex=sx;
maze[sx][sy-1].prey=sy;
sy-=1;
}
else if(dir=='E')
{
maze[sx][sy+1].prex=sx;
maze[sx][sy+1].prey=sy;
sy+=1;
}
int x,y;
while(cin>>x)
{
if(x==0)
break;
cin>>y;
getline(cin,maze[x][y].s);
//cout<<x<<' '<<y<<' '<<maze[x][y].s<<endl;
}
while(Q.empty()==false) Q.pop();
Q.push(maze[sx][sy]);
memset(mark,false,sizeof(mark));
mark[sx][sy]=true; //这一句一定要加
BFS();
//cout<<ans<<endl;
if(ans==true)
print(ex,ey);
else
cout<<"fail"<<endl;
}
return 0;
}