HDU 1728 逃离迷宫
简单搜索。记录一下到某个点,朝某个方向的最小转弯次数。
#include<iostream> #include<string> #include<iomanip> #include<string.h> #include<algorithm> #include<cstdio> using namespace std; int INF=0x7FFFFFFF; const int maxn=100+5; int n,m; char s[maxn][maxn]; int MIN[5][maxn][maxn]; int X1,X2,Y1,Y2,K; int dir[4][2]={ {0,1}, {1,0}, {0,-1}, {-1,0} }; int flag; bool P(int a,int b) { if(a>=0&&a<=n-1) { if(b>=0&&b<=m-1) { if(s[a][b]!='*') { return 1; } } } return 0; } void dfs(int a,int b,int d,int tot) { if(tot>K) return; if(a==X2&&b==Y2) { flag=1; return; } for(int i=0;i<4;i++) { int x=a+dir[i][0]; int y=b+dir[i][1]; if(P(x,y)==0) continue; if(i==d) { if(tot<MIN[i][x][y]) { MIN[i][x][y]=tot; dfs(x,y,i,tot); } } else { if(tot+1<MIN[i][x][y]) { MIN[i][x][y]=tot+1; dfs(x,y,i,tot+1); } } } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",s[i]); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { MIN[0][i][j]=INF; MIN[1][i][j]=INF; MIN[2][i][j]=INF; MIN[3][i][j]=INF; } scanf("%d%d%d%d%d",&K,&Y1,&X1,&Y2,&X2); X1--; Y1--; X2--; Y2--; flag=0; for(int i=0;i<4;i++) { MIN[i][X1][Y1]=0; dfs(X1,Y1,i,0); if(flag) break; } if(flag) printf("yes\n"); else printf("no\n"); } return 0; }