前言
正文
读完题目后,综合算法标签,我们不难知道,这是一道搜索题,既可以用深搜(DFS)来做,也可以用广搜(BFS)来做。由于题目中只要求输出一种路径,在此篇中只采取更合适的深搜做法,广搜做法不予讨论。下面直接上代码
Code
#include<iostream>
using namespace std;
int r,c;
char sq[200][200];
bool st[200][200]={false};
int ansx[10001],ansy[10001];
int fx[]={0,-1,1,0};
int fy[]={1,0,0,-1};
void dfs(int x,int y,int step)
{
if(x==r&&y==c)
{
for(int i=1;i<step;i++)
{
cout<<ansx[i]<<" "<<ansy[i]<<endl;
}
cout<<r<<" "<<c<<endl;
return;
}
ansx[step]=x;
ansy[step]=y;
for(int i=0;i<4;i++)
{
int tx=x+fx[i];
int ty=y+fy[i];
if(tx>=1&&tx<=r&&ty>=1&&ty<=c&&st[tx][ty]==false)
{
st[tx][ty]=true;
dfs(tx,ty,step+1);
}
}
}
int main()
{
cin>>r>>c;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
cin>>sq[i][j];
if(sq[i][j]=='*') st[i][j]=true;
}
}
st[1][1]=true;
dfs(1,1,1);
return 0;
}
在代码中,我们将路径的行和列分别存在两个数组里,当达到终点时输出,并利用st数组(visit状态数组)判断是否能走,使用step来表示路径长度,以便于输出。
注意点
1.要在深搜开始前,将出发点标为true,否则会0AC(亲身经历)
2.在输入时要将障碍处标记成true
3.在达到目标点输出时,循环条件要让i<r,然后再循环外输出r和c。如果不想这么麻烦,也可以先把r和c分别存到ansx和ansy中在进行输出,此时循环条件为i<=r,两种方法效果一样,看个人喜好
4.最好在这题上面不要擅自修改地图,有可能会WA或TLE(亲身经历)
5.至少要将sq数组和st数组的空间开到[150][150],否则最后一个测试点会RE(亲身经历)
后记
本人创作不易,后续有时间的时候我将第一时间更新,不知可否要到您的一个赞和关注,感激不尽!