链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1110

题意:从起点走到目的地,不能回退到走过的格子,S表示起点,D表示终点,X表示墙,’ . ’表示空格,求在规定时间t内,能否到达终点。n,m表示迷宫的长和宽。

思路:dfs,从起点开始搜,每个格子有四个方向,一个一个地搜。每搜一个格子,就要把格子设为X,因为不能走重复的格子,遇到墙壁或者边界就走不动,走不动就回退,要把格子恢复为‘ . ’,回到上一步的情况。如果某个位置满足条件,就停止搜索。如果全部分支都搜索完了还找不到解,就无解。

其中有两处剪枝,一处是在主函数中,如果空格子数小于等于时间t,那么肯定无解。另一处是在dfs函数中,temp为当前剩余时间与到终点所要花的最短时间的差,如果为负或者是奇数就肯定不能成功。因为如果是奇数的话,就不满足那个,嗯,只能意会不能言传。。。

#include<cstdio>
#include<cmath>
int n,m,t;
int di,dj;
int escape;
char map[8][8];
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
void dfs(int si,int sj,int cnt)
{if(si>=n||sj>=m||si<0||sj<0) return;if(si==di && sj==dj &&cnt==t){escape=1;return;}int temp=(t-cnt)-fabs(si-di)-fabs(sj-dj);if(temp<0 || temp%2!=0) return;//剪枝for(int i=0;i<4;i++)if(map[si+dir[i][0]][sj+dir[i][1]] != 'X'){map[si+dir[i][0]][sj+dir[i][1]]='X';dfs(si+dir[i][0],sj+dir[i][1],cnt+1);if(escape) return;else map[si+dir[i][0]][sj+dir[i][1]]='.';}return;
}
int main()
{int si,sj;int wall;while(scanf("%d%d%d",&n,&m,&t) &&n&&m&&t){getchar();wall=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%c",&map[i][j]);if(map[i][j]=='S'){si=i;sj=j;}else if(map[i][j]=='D'){di=i;dj=j;}else if(map[i][j]=='X')wall++;}getchar();}if(n*m-wall<=t)//剪枝printf("NO\n");else{escape=0;map[si][sj]='X';dfs(si,sj,0);if(escape) printf("YES\n");else printf("NO\n");}}return 0;
}

转载于:https://www.cnblogs.com/54zyq/archive/2013/05/11/3072574.html

zoj 2110 dfs,剪枝相关推荐

  1. 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 ...

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

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

  3. poj2362 DFS+剪枝

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

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

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

  5. 【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 ...

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

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

  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. 漫画算法:5分钟搞明白红黑树到底是什么?
  2. 软件外包是中国程序员的大金矿,大家一起来挣×××吧
  3. python 私有云_利用Docker+NextCloud搭建私有云盘
  4. 排序算法笔记:堆排序 HeapSort in java
  5. rediscluster全局数据_redis迁移,从redis cluster集群迁移数据到另外一个redis cluster集群...
  6. codeforce 272B Dima and Sequence
  7. 初一模拟赛(4.20)
  8. pg订阅oracle修改,PostgreSQL修改数据库timezone
  9. java 内存溢出分析_用一段时间后java内存溢出问题分析(转)
  10. 2.5、调用后置处理器
  11. OO Summary (Homework 5-7)
  12. 文字和图片放一起, 文字下沉的处理方法
  13. Qt + 运动控制 (固高运动控制卡)【2】运动控制卡初始化和关闭
  14. 诱人的 react 视频教程-基础篇(14 个视频)
  15. 安卓强刷linux,安卓系统使用dd命令强制刷入以强制升降级、刷入低底包
  16. 思考力——提升企业竞争力的核心因素
  17. Word Rotator‘s Distance——WRD算法应用
  18. Cisco 防火墙Firwall Failover ActiveActive 双HSRP 实现双ISP完美切换
  19. API数据接口该怎么对接
  20. 医学主题词表(Medical Subject Headings, MeSH)

热门文章

  1. windows下使用word2vec训练维基百科中文语料全攻略!(二)
  2. GoogLeNet的心路历程(一)
  3. 第一章 | 使用python机器学习
  4. 为什么在实际的 kaggle 比赛中 gbdt 和 random forest 效果非常好?
  5. 图像数据转换成db(leveldb/lmdb)文件(转)
  6. 屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_轻量化 | 如何让笨重的深度学习模型在移动设备上跑起来?看它!...
  7. java多线程机制计时器_java多线程定时器与单例模式
  8. 求圈地的方块数java,java实现第三届蓝桥杯方块填数
  9. Java泛型中extends和super的区别?
  10. pdfbox java.lang.outofmemoryerror_java - PDFBox 2.0.1挂起渲染pdf页面 - 堆栈内存溢出