障碍路线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;
}

 

posted @ 2017-08-23 15:38  WeiAR  阅读(349)  评论(0编辑  收藏  举报