博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3009 Curling 2.0【带回溯DFS】
阅读量:5329 次
发布时间:2019-06-14

本文共 1519 字,大约阅读时间需要 5 分钟。

题意:

给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物也会随之消失,如果行动时超出方格的界限或行动次数超过了10则会game over .如果行动时经过3则会win,记下此时行动次数(不是行动的方格数),求最小的行动次数
#include
#include
#include
using namespace std;typedef long long LL;const int INF = 0x7FFFFFFF;const int maxn = 1e5 + 10;int dir[4][2] = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };int ei, ej;int map[25][25];int w, h, steps, MIN;#define MAX 99999999void dfs(int si, int sj){ int i, pi, pj; if (steps >= 10) return; for (i = 0; i<4; i++) { pi = si, pj = sj; while (1) { pi += dir[i][0]; pj += dir[i][1]; if (pi <= 0 || pi>h || pj <= 0 || pj > w) break;//如果越界,选择其他方向 if (pi == ei&&pj == ej) { steps++; if (MIN > steps) MIN = steps; steps--; return; } else if (map[pi][pj] == 1)//如果遇到障碍物 { if(pi-dir[i][0]!=si||pj-dir[i][1]!=sj)//如果不是起步 { map[pi][pj] = 0;//消除障碍物 steps++;//前进一步 dfs(pi - dir[i][0], pj - dir[i][1]);//递归查找该点到终点的最小步数 map[pi][pj] = 1;//还原障碍物 steps--;//还原步数 } break; } } }}int main(){ int si, sj, i, j; while (scanf("%d%d", &w, &h) == 2 && (w || h)) { for (i = 1; i <= h; i++)//输入并找到起点和终点 for (j = 1; j <= w; j++) { scanf("%d", &map[i][j]); if (map[i][j] == 2) si = i, sj = j; else if (map[i][j] == 3) ei = i, ej = j; } MIN = MAX;//记录最小步数 steps = 0;//初始化步数 dfs(si, sj);//深搜 if (MIN == MAX) puts("-1"); else printf("%d\n", MIN); } return 0;}

转载于:https://www.cnblogs.com/demian/p/6151388.html

你可能感兴趣的文章
vsftpd虚拟用户【公司系统部分享】
查看>>
盒子box在网页中居中的方法
查看>>
Python之旅Day14 JQuery部分
查看>>
二十一、 Memento 备忘录(行为型模式)
查看>>
python 3.X中打包二进制数据存储字符串出错原因分析
查看>>
core--线程池
查看>>
B+树介绍
查看>>
redux-effect
查看>>
Swift和OC混编
查看>>
深度学习文献阅读笔记(6)
查看>>
Android轻量级的开源缓存框架ASimpleCache
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
[PHP] excel 的导入导出
查看>>
docker-containerd 启动流程分析
查看>>
SDL(01-10)
查看>>
网络爬虫基本原理(一)
查看>>
HDU 1021 Fibonacci Again
查看>>
【BZOJ 1050】1050: [HAOI2006]旅行comf (动态SPFA)
查看>>
Handler.sendMessage 与 Handler.obtainMessage.sendToTarget比较
查看>>