题意:求在地图中从A到B的最小转弯次数
题解:很明显的一个搜索题,这里我的做法采用dfs,dfs里面保存状态x,y,t,fa,分别代表当前位置的x,y,已经转弯次数,上次行走的方式。然后从A dfs到B,详细步骤可查看代码注释
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=105;
char Map[N][N];
int ans,n;
int sx,sy,ex,ey;
int change[4][2]={1,0,-1,0,0,1,0,-1};
int vis[N][N];
bool legal(int x,int y){
if (x>=1&&x<=n&&y>=1&&y<=n)
return 1;
return 0;
}
void dfs(int x,int y,int t,int fa){
if (x==ex&&y==ey){//终点判断
ans=min(ans,t);
return;
}
if (t>=ans)//这里没有就会超时
return;
for (int i=0;i<4;i++){
if (!legal(x+change[i][0],y+change[i][1]))
continue;
if (Map[x+change[i][0]][y+change[i][1]]=='x')
continue;
if (vis[x+change[i][0]][y+change[i][1]]==0){
vis[x+change[i][0]][y+change[i][1]]=1;
if (fa!=-1&&i!=fa)
dfs(x+change[i][0],y+change[i][1],t+1,i);
else
dfs(x+change[i][0],y+change[i][1],t,i);
vis[x+change[i][0]][y+change[i][1]]=0;//dfs的回溯
}
}
}
int main(){
scanf("%d%*c",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%c",&Map[i][j]),getchar();
for (int i=1;i<=n;i++)//这步可以省略到前面的读入,分开写也一样
for (int j=1;j<=n;j++)
if (Map[i][j]=='A')
sx=i,sy=j;
else if (Map[i][j]=='B')
ex=i,ey=j;
ans=1e9;//初始化一个比较大的值就可以了,不一定是1e9。
dfs(sx,sy,0,-1);
if (ans!=1e9)//存在找不到的情况,如果你样例通过率90%,就大概是这问题
cout<<ans<<endl;
else
puts("-1");
return 0;
}


京公网安备 11010502036488号