障碍路线Obstacle Course
P1649 [USACO07OCT]障碍路线Obstacle Course
裸的dfs,今天学了一个新招,就是在过程中进行最优性减枝。
#include<bits/stdc++.h> using namespace std; int n,sx,sy,ex,ey,ans=99999999; char a[110][110]; int d[110][110]; int x[]={-1,0,1,0}; int y[]={0,1,0,-1}; bool vis[110][110]; void dfs(int nx,int ny,int dir,int num) { if(nx>n||nx<1||ny>n||ny<1||vis[nx][ny]||ans==0) return; if(a[nx][ny]=='x') return; if(num>=ans) return ; if(num>d[nx][ny]) return; d[nx][ny]=num; if(nx==ex&&ny==ey) { if(num<ans) ans=num; return ; } for(int i=0;i<4;i++) { if((abs(i-dir)==2||abs(i-dir)==0)&&nx+x[i]>0&&ny+y[i]>0&&!vis[nx+x[i]][ny+y[i]]) { vis[nx][ny]=true; dfs(nx+x[i],ny+y[i],i,num); vis[nx][ny]=false; } else if(!vis[nx+x[i]][ny+y[i]]&&nx+x[i]>0&&ny+y[i]>0) { vis[nx][ny]=true; dfs(nx+x[i],ny+y[i],i,num+1); vis[nx][ny]=false; } } } int main() { cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { cin>>a[i][j]; if(a[i][j]=='A') sx=i,sy=j; if(a[i][j]=='B') ex=i,ey=j; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { d[i][j]=99999999; } for(int i=0;i<4;i++) dfs(sx+x[i],sy+y[i],i,0); if(ans!=99999999) cout<<ans; else cout<<-1; return 0; }