http://poj.org/problem?id=3009

模拟冰壶的移动,给出到达终点的最少投掷次数(不可达时为-1)。

具体移动规则如下:

每次选四个方向之一,沿此方向一直前进,直到撞到block或出界或抵达目标位置。

  如果撞到block,冰壶停在block的前一个位置,block消失,此时可改变冰壶的移动方向(重新投掷一次);

  如果出界,则这条移动路径以失败结束;

  如果抵达目标位置,则记录这条移动路径一共投掷的次数。

投掷次数不超过10次的为成功路径。

如果存在成功路径,输出最少的投掷次数;不存在则输出-1。

代码如下,由于数据量小,可用DFS得到所有解然后取最小值;注意回溯时还原修改过的block:

 #include <cstdio>
#include <cstring>
using namespace std; const int MAX_N = ; int n, m;
int G[MAX_N][MAX_N];
int dx[]={, , ,-}, dy[]={, -, , };
int sx, sy, gx, gy;
int min_ans; bool inside(int x, int y){
if(x< || x>=n || y< || y>=m) return false;
return true;
} void dfs(int x, int y, int cnt){
if(cnt > ) return ;
for(int i=; i<; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(!inside(x, y)) continue; //出界
if(G[nx][ny] == ) continue; //block
else{
while(inside(nx, ny) && G[nx][ny] != && G[nx][ny] != ){
nx += dx[i];
ny += dy[i]; //沿此方向走到block为止
}
if(!inside(nx, ny)) continue; //此方向最终出界
if(G[nx][ny] == ){
min_ans = cnt<min_ans ? cnt : min_ans;
continue; //此方向中途命中
} G[nx][ny] = ; //block消失
nx -= dx[i];
ny -= dy[i]; //抵达此方向最后一个合法位置,block的前一个
//printf("%d %d\n", dx[i], dy[i]);
dfs(nx, ny, cnt+);
nx += dx[i];
ny += dy[i];
G[nx][ny] = ; //还原,回溯
}
}
return ;
} int main()
{
freopen("3009.txt", "r", stdin);
while(scanf("%d%d", &m, &n) != EOF){
if(m== && n==) break;
for(int i=; i<n; i++){
for(int j=; j<m; j++){
scanf("%d", &G[i][j]);
if(G[i][j] == ){
sx = i;
sy = j;
}else if(G[i][j] == ){
gx = i;
gy = j;
}
}
} min_ans = ; //任意大于10的值
dfs(sx, sy, ); //投掷第一次
if(min_ans > ) min_ans = -;
printf("%d\n", min_ans);
}
return ;
}

注意记这一类搜索的框架,以及联系算法课学过的回溯法的基本概念,如约束条件、活结点等。

【POJ 3009 Curling2.0 迷宫寻径 DFS】的更多相关文章

  1. POJ 3009 Curling 2.0【带回溯DFS】

    POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...

  2. POJ 3009 Curling 2.0 {深度优先搜索}

    原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules ...

  3. POJ 3009:Curling 2.0 推箱子

    Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14090   Accepted: 5887 Desc ...

  4. 2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)

    2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意) P1363 幻象迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 幻象迷宫可以认为是无限 ...

  5. POJ 1979 Red and Black【DFS】

    标准DFS,统计遍历过程中遇到的黑点个数 #include<cstdio> #include<vector> #include<queue> #include< ...

  6. poj 1724 ROADS 很水的dfs

    题意:给你N个城市和M条路和K块钱,每条路有话费,问你从1走到N的在K块钱内所能走的最短距离是多少 链接:http://poj.org/problem?id=1724 直接dfs搜一遍就是 代码: # ...

  7. POJ 1745 【0/1 背包】

    题目链接:http://poj.org/problem?id=1745 Divisibility Time Limit: 1000MS   Memory Limit: 10000K Total Sub ...

  8. POJ 3009 Curling 2.0(DFS + 模拟)

    题目链接:http://poj.org/problem?id=3009 题意: 题目很复杂,直接抽象化解释了.给你一个w * h的矩形格子,其中有包含一个数字“2”和一个数字“3”,剩下的格子由“0” ...

  9. POJ 3009 Curling 2.0 回溯,dfs 难度:0

    http://poj.org/problem?id=3009 如果目前起点紧挨着终点,可以直接向终点滚(终点不算障碍) #include <cstdio> #include <cst ...

随机推荐

  1. C# Exception类

    一.异常类 1.在C#中所有的异常都是使用一个异常类型的示例对象表示的,这些异常类型都是继承自System.Exception类型,或者直接使用System.Exception类型的实例对象: 2.在 ...

  2. php php打乱数组二维数组、多维数组

    php中的shuffle函数只能打乱一维数组,有什么办法快速便捷的打乱多维数组?手册上提供了 <?php function shuffle_assoc($list) {      if (!is ...

  3. Funny Sheep(思维)

    Problem 1606 - Funny Sheep Time Limit: 1000MS   Memory Limit: 65536KB    Total Submit: 612  Accepted ...

  4. linux内核中驱动开发常见的相似多态

    #include<stdio.h> #include<stdlib.h> struct test { char name[20]; void (*func)(char *); ...

  5. Codeforces 474D Flowers dp(水

    题目链接:点击打开链接 思路: 给定T k表示T组測试数据 每组case [l,r] 有2种物品a b.b物品必须k个连续出现 问摆成一排后物品长度在[l,r]之间的方法数 思路: dp[i] = d ...

  6. 设置Android设备在睡眠期间始终保持WLAN开启的代码实现

    MainActivity例如以下: package cc.ab; import android.os.Bundle; import android.provider.Settings; import ...

  7. hdu 4750 Count The Pairs (2013南京网络赛)

    n个点m条无向边的图,对于q个询问,每次查询点对间最小瓶颈路 >=f 的点对有多少. 最小瓶颈路显然在kruskal求得的MST上.而输入保证所有边权唯一,也就是说f[i][j]肯定唯一了. 拿 ...

  8. js的for in循环和java里的foreach循环的差别

    js里的for in循环定义例如以下: for(var variable in obj) { ... } obj能够是一个普通的js对象或者一个数组.假设obj是js对象,那么variable在遍历中 ...

  9. linux进程间通信之共享内存篇

    本文是对http://www.cnblogs.com/andtt/articles/2136279.html中共享内存(上)的进一步阐释说说明 1 共享内存的实现原理 共享内存是linux进程间通讯的 ...

  10. 64bit ubuntu14.04编译PlatinumKit出现的arm-linux-androideabi-g++: not found错误解决方法

    编译命令:scons target=arm-android-linux build_config=Release 出现错误: scons: Reading SConscript files ...** ...