DFS加回溯吧。自己不会回溯,所以这题就没那么简单了、、、
还是借鉴了大神的代码,在这记下来。
这题用回溯把要输出的点保存在栈里,先把没访问过的点放入栈,然后判断是不是到达终点。下面就是判断右边的点和下边的点是否符合要求,符合就DFS,不符合就回溯回到上一个岔路口,并且把不符合的点在栈中删除。
边界处理初始化为1,之前发生过RE,原因是5*5的迷宫加上边界6*6,我只开了6*6,所以RE了。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
#include <cstdio>
using namespace std;
int arr[7][7];
int visit[7][7];
typedef pair<int,int> P;
stack<P> sk;
P p;
void dfs(int a,int b)
{
if(!visit[a][b])
{
p.first=a;
p.second=b;
sk.push(p);
visit[a][b]=!visit[a][b];
}
if(a==5 && b==5) return ;
if(!visit[a][b+1] && !arr[a][b+1])
{
dfs(a,b+1);
}
else if(!visit[a+1][b] && !arr[a+1][b])
{
dfs(a+1,b);
}
else
{
p.first=sk.top().first;
p.second=sk.top().second;
sk.pop();
dfs(p.first,p.second);
}
}
int main()
{
for(int i=0;i<=6;i++)
{
arr[i][0]=1;
arr[i][6]=1;
arr[0][i]=1;
arr[6][i]=1;
}
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
scanf("%d",&arr[i][j]);
memset(visit,0,sizeof(visit));
dfs(1,1);
vector<P> v;
while(!sk.empty())
{
p=sk.top();
v.push_back(p);
sk.pop();
}
for(int i=v.size()-1;i>=0;i--)
printf("(%d, %d)\n",v[i].first-1,v[i].second-1);
return 0;
}
PS:用结构体代替pair更方便。