//多个起点,要最短得目标,不妨倒过来从目标出发,去找最近的点更新!!!!!!递归时思路要清楚

#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;
   }
}  

HDU 1242 dFS 找目标最短路的更多相关文章

  1. hdu 1242 dfs/bfs

    Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is ...

  2. hdu 1242 Rescue

    题目链接:hdu 1242 这题也是迷宫类搜索,题意说的是 'a' 表示被拯救的人,'r' 表示搜救者(注意可能有多个),'.' 表示道路(耗费一单位时间通过),'#' 表示墙壁,'x' 代表警卫(耗 ...

  3. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  4. HDU 5143 DFS

    分别给出1,2,3,4   a, b, c,d个 问能否组成数个长度不小于3的等差数列. 首先数量存在大于3的可以直接拿掉,那么可以先判是否都是0或大于3的 然后直接DFS就行了,但是还是要注意先判合 ...

  5. 《31天成为IT服务达人》--做事篇(第四章)之如何找目标

     前面介绍了什么是IT服务.以下几章将介绍IT服务该怎么做.在聊怎么做之前.想起几句流行的告白和准备入行IT服务事业的朋友共勉. 当你的才华 还撑不起你的野心时 就应该静下心来 学习 --- 当你 ...

  6. CodeForces - 103B(思维+dfs找环)

    题意 https://vjudge.net/problem/CodeForces-103B 很久很久以前的一天,一位美男子来到海边,海上狂风大作.美男子希望在海中找到美人鱼 ,但是很不幸他只找到了章鱼 ...

  7. # 「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程)

    「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程) 题链 题意:n条边n个节点的连通图,边权为两个节点的权值之和,没有「自环」或「重边」,给出的图中有且只有一个包括奇数个结点的环 ...

  8. F - JDG HDU - 2112 (最短路)&& E - IGNB HDU - 1242 (dfs)

    经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬 ...

  9. Let‘s play computer game(最短路 + dfs找出所有确定长度的最短路)

    Let's play computer game Description xxxxxxxxx在疫情期间迷上了一款游戏,这个游戏一共有nnn个地点(编号为1--n1--n1--n),他每次从一个地点移动 ...

随机推荐

  1. 公共Service的抽取小例

    package cn.sxx.service; import java.util.List; public interface BaseService<T,Q> { public void ...

  2. glove 安装错误

    https://stackoverflow.com/questions/44921611/error-installing-glove-python-link-exe-failed-with-exit ...

  3. 人脸识别源代码Open cv

    #include <stdio.h> #include <string.h> #include "cv.h" #include "cvaux.h& ...

  4. Instance Methods are Curried Functions in Swift

    An instance method in Swift is just a type method that takes the instance as an argument and returns ...

  5. Git学习之路

    目录 git安装 linux windows git命令 创建版本库 提交文件 仓库状态 版本回退 工作区和暂存区 工作区 暂存区 推送.下拉和克隆 推送 下拉 克隆 git应该可以说是程序员必备技能 ...

  6. 【图论】hdu6370Werewolf

    有理有据的结论题 Problem Description "The Werewolves" is a popular card game among young people.In ...

  7. 【动态规划】bzoj1044: [HAOI2008]木棍分割

    需要滚动优化或者short int卡空间 Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍 ...

  8. React碰到v-if

    最近在重构公司老项目,由于本人以前的技术栈是vue, 换工作后发现现在公司的技术栈是react, 所以重构的过程是及其痛苦.加之项目又是几年前的老项目,不敢大改,比葫芦画瓢比比皆是.本文就介绍下遇到的 ...

  9. win32应用程序和win32控制台应用程序的区别

          win32应用程序是有窗体的(当然也可以没有),有Windows消息循环机制的.而win32控制台应用程序只是在控制台下运行的程序,类似以前dos的程序. 后续答案: Win32 Appl ...

  10. IE8 png图片黑色阴影的解决方案!

    以前都没有留意这个问题,最近开发中才发现. 什么情况下会出现黑边? PNG透明图片,同时有阴影,具备着两个IE8是不会有问题的,再加上使用了 “渐变显示”,就会出现了. 解决方法: img{displ ...