题意:拯救行动,天使r有多个朋友a(friends,在这里被坑了几次,没看清题意),天使被关在牢房里,等着朋友来拯救,求拯救天使的最短距离。

解法:如果不剪枝,200*200的地图会超时,可以以天使为起点进行dfs,记录到达map[x][y]的最小值、到达每个a的最小值。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;const int M = 205;
char map[M][M];
int minL[M][M];   //记录到达x,y的最小值,如果再次到达大于最小值,则说明没有必要走下去了
int minLtoR;
int visited[M][M];
int n,m;
//int step;
int dire[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};
void dfs(int v1,int v2,int step)
{if(map[v1][v2] == 'a'){if (step < minLtoR){minLtoR = step;  //记录到达a的最小值
        }else return;}for (int i = 0; i < 4; i++){int x = v1+dire[i][0];int y = v2+dire[i][1];if (!visited[x][y] && map[x][y]!='#' && x < n && x >= 0 && y < m && y >= 0){if (step+1 > minL[x][y])continue;    //没有必要再走下去了else minL[x][y] = step+1; //更新最小值visited[x][y] = 1;if (map[x][y] == 'x')dfs(x,y,step+2);else dfs(x,y,step+1);visited[x][y] = 0;}}
}
int main()
{while (cin >> n >> m){int step = 0;minLtoR = 1000000;int x,y;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> map[i][j];visited[i][j] = 0;minL[i][j] = 1000000;if (map[i][j] == 'r'){x = i;y = j;}}}dfs(x,y,step);if (minLtoR == 1000000)cout << "Poor ANGEL has to stay in the prison all his life.\n";else cout << minLtoR << endl;}return 0;
}

博客原创,转载请说明出处。

转载于:https://www.cnblogs.com/ediszhao/p/4741825.html

hdoj1242(dfs 剪枝 解法)相关推荐

  1. [DFS|剪枝] leetcode 22 括号生成

    [DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...

  2. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  3. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  4. poj2362 DFS+剪枝

    题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...

  5. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  6. 【HDU - 1518】Square (经典的dfs + 剪枝)

    题干: Given a set of sticks of various lengths, is it possible to join them end-to-end to form a squar ...

  7. poj2248 DFS+剪枝 or BFS

    传送门 2248:Addition Chains 描述 An addition chain for n is an integer sequence with the following four p ...

  8. 2020 ICPC 南京 H Harmonious Rectangle (DFS剪枝+思维)

    题目链接H-Harmonious Rectangle_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京) 题目描述 A vertex-colored rectangle is a rec ...

  9. DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山

    DFS(剪枝与优化) - 洛谷 P1361 - 小猫爬山 翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_&l ...

最新文章

  1. Docker系列 一. CentOS上安装Docker
  2. 数据分析系列:绘制散点图(matplotlib)
  3. 自己整理的计算机视觉领域稍微容易中的期刊(第一版)
  4. 解决Error: Cannot find module 'node-sass'问题
  5. 首批唯一!阿里云视频直播服务获信通院首批唯一认证
  6. C#原型模式之深复制实现
  7. Html、CSS、JavaScript 实时效果在线编辑器 - 学习的好工具,算不算?!
  8. Python3 网络爬虫:下载小说的正确姿势
  9. 计算机打印中 进纸盘2,软件、计算机和打印机接口问题-HP.PDF
  10. 卢伟冰正式预告Redmi K30:首发双开孔全面屏+双模5G
  11. 深入理解java虚拟机章节_深入理解java虚拟机-第六章
  12. 一、在Linux下,Nginx初安装及简单配置
  13. Python星号表达式
  14. 单个产品出库扣减库存
  15. PMP学习笔记 零 启动
  16. java udp 接收16进制,java udp接收16进制乱码
  17. 二元logistic回归前的单因素分析
  18. 防止汽轮机严重超速的技术措施 22437
  19. 网络安全——社会工程学02
  20. VMware虚拟机怎么安装win7系统【图文】

热门文章

  1. Python Django手写分页代码
  2. 【Java面试题】汽水瓶问题
  3. 【视频】v-bind的使用
  4. HDFS分布式文件系统理论知识
  5. Windows彻底卸载删除MySQL
  6. Hadoop大数据分布式文件系统hdfs的Java操作
  7. python反爬虫策略ppt_了解python爬虫怎样对抗反爬虫策略-
  8. matlab的guide怎么添加函数,整理:matlab如何添加m_map工具箱
  9. java如何爬取304_HTTP 304错误的详细讲解
  10. matlab 工业相机 曝光时间_机器视觉入门——光源相机镜头