现在的位置: 首页 > 综合 > 正文

HDU 1242 dFS 找目标最短路

2013年08月27日 ⁄ 综合 ⁄ 共 2405字 ⁄ 字号 评论关闭
//多个起点,要最短得目标,不妨倒过来从目标出发,去找最近的点更新!!!!!!递归时思路要清楚

#include<iostream>
#include<cstring>
using namespace std;
int a[202][202]; int ax,ay;int f[4][2]={0,1,1,0,-1,0,0,-1};int mmin=50000;int visit[202][202];
 void dfs(int x,int y,int count)     
 {
     if(a[x][y]==0)return;
     else if(a[x][y]==2)count=count+2;         //步数计数!不同情况。每次走一步深一层时计数
     else count++;
     if(a[x][y]==4)                            //出口!
     {
         if(count<mmin)mmin=count;
     }
     else
     {
         for(int i=0;i<4;i++)                   //走
         {
             if(visit[x][y]==0&&a[x][y]!=0)      //没访问或者不被限制的
            {
             visit[x][y]=1;
             dfs(x+f[i][0],y+f[i][1],count);      //如此深入
             visit[x][y]=0;
            }
         }
     }
 }
int main()
{
   int n,m;
   while(cin>>n>>m)
   {
       memset(a,0,sizeof(a));
       memset(visit,0,sizeof(0));
       int i,j;
       mmin=50000;
       char s;
       for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
          {
              cin>>s;
              if(s=='a')
              {
                  ax=i;ay=j;a[i][j]=3;
              }
              else if(s=='r') a[i][j]=4;
              else if(s=='.')  a[i][j]=1;
              else if(s=='x') a[i][j]=2;
          }
       dfs(ax,ay,0);
       if(mmin==50000)cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
       else  cout<<mmin-1<<endl;
   }
}
//下面是BFS:
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int a[202][202]; int ax,ay;int f[4][2]={0,1,1,0,-1,0,0,-1};int mmin=50000;int visit[202][202];
struct state
{
    int x,y;
    int count;
   state(){count=0;}
};
 void bfs(state aa)
 {
     queue<state>q;       
     q.push(aa);
     while(!q.empty())      
     {
         state now=q.front();      //对队头元素分析
         visit[now.x][now.y]=1;     //标记访问
         q.pop();
         if(a[now.x][now.y]==4)    //更新
         {
             if(now.count<mmin)mmin=now.count;
         }
        else
        {
          for(int i=0;i<4;i++)       //队头拉出其他元素
          {
            state next;
            next.x=now.x+f[i][0],next.y=now.y+f[i][1] ;     //没访问或者不被限制的
            if(a[next.x][next.y]==1||a[next.x][next.y]==4)next.count=now.count+1;
            else if(a[next.x][next.y]==2)next.count=now.count+2;
            if(visit[next.x][next.y]==0&&a[next.x][next.y]!=0)
            {
               q.push(next);
            }
           }
        }
     }
 }
int main()
{
   int n,m;
   while(cin>>n>>m)
   {
       memset(a,0,sizeof(a));
       memset(visit,0,sizeof(visit));
       int i,j;
       mmin=50000;
       char s;
       for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
          {
              cin>>s;
              if(s=='a')
              {
                  ax=i;ay=j;a[i][j]=3;
              }
              else if(s=='r') a[i][j]=4;
              else if(s=='.')  a[i][j]=1;
              else if(s=='x') a[i][j]=2;
          }
        state aa;
        aa.x=ax;aa.y=ay;aa.count=0;
       bfs(aa);
       if(mmin==50000)cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
       else  cout<<mmin<<endl;
   }
}

 

抱歉!评论已关闭.