更好的阅读体验
【想法】题目简单,长宽都固定了下来,直接深搜就行。就是记录路径有点障碍,稍微一想就行,还是那句话:一个人可能有多个儿子,但是一定只有一个爸爸,所以每次搜索的时候直接记录当前节点的爸爸是谁就行,然后由最后依次向前统计出路径,压到栈中,反序输出就是答案了。因为起始点和终止点都固定了下来,所以可以用特征值直接扫出答案。
【代码】
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
int mat[10][10];
int pre[10][10];
struct P
{
int x,y;
P(int X,int Y):x(X),y(Y){}
};
queue<int>lu;
int changex[4]={0,0,1,-1};
int changey[4]={1,-1,0,0};
int main()
{
//freopen("in.txt","r",stdin);
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
{
scanf("%d",&mat[i][j]);
pre[i][j]=i*1000+j;
}
lu.push(0);
int x,y,cx,cy;
while(!lu.empty())
{
x=lu.front()/1000;
y=lu.front()%1000;
lu.pop();
for(int i=0;i<4;i++)
{
cx=x+changex[i];
cy=y+changey[i];
if(cx<0||cx>4||cy<0||cy>4||mat[cx][cy])
continue;
else if(cx==4&&cy==4)
{
pre[cx][cy]=x*1000+y;
break;
}
else if(pre[cx][cy]==cx*1000+cy)
{//这个点没有搜索过
pre[cx][cy]=x*1000+y;
lu.push(cx*1000+cy);
}
}
}
stack <P> ans;
ans.push(P(4,4));
x=4,y=4;
while(x||y)
{
cx=pre[x][y]/1000;
cy=pre[x][y]%1000;
ans.push(P(cx,cy));
x=cx,y=cy;
}
while(!ans.empty())
{
printf("(%d, %d)\n",ans.top().x,ans.top().y);
ans.pop();
}
return 0;
}