题意:求在地图中从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; }