poj3009 Curling 2.0(很好的题 DFS)

https://vjudge.net/problem/POJ-3009

做完这道题,感觉自己对dfs的理解应该又深刻了。

1.一般来说最小步数都用bfs求,但是这题因为状态记录很麻烦,所以可以用dfs。

2.在用dfs的时候,mp时一个全局变量,对于平等的走法,每一个走法结束后一定要状态复原!!!(也就是代码36-38行)否则会对其他走法产生影响。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<stack>
 8 #define lson l, m, rt<<1
 9 #define rson m+1, r, rt<<1|1
10 #define IO ios::sync_with_stdio(false);cin.tie(0);
11 #define INF 0x3f3f3f3f
12 typedef unsigned long long ll;
13 using namespace std;
14 int n, m, mp[30][30], si, sj, gi, gj, cnt, mini;
15 int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
16 void dfs(int x, int y, int a, int b, int k, int c)
17 {
18     if(k > 10||k > mini) return ;
19     if(x == gi&&y == gj){
20         mini = min(mini, k);
21         return ;
22     }
23     if(a != 0||b != 0){//不是刚开始
24         if(x<0||x>=n||y<0||y>=m){
25             return;//失败
26         }
27         else if(mp[x][y] == 1){
28             if(c <= 1) return ;
29             c = 0;
30             mp[x][y] = 0;//该阻被消去
31             x -= a;
32             y -= b;//回到上一状态
33             for(int i = 0; i < 4; i++){
34                 dfs(x+dir[i][0], y+dir[i][1], dir[i][0], dir[i][1], k+1, c+1);
35             }
36             x += a;
37             y += b;
38             mp[x][y] = 1;//记住要状态复原!!
39         }
40         else{
41             dfs(x+a, y+b, a, b, k, c+1);
42         }
43     }
44     else{
45         for(int i = 0; i < 4; i++){
46             dfs(x+dir[i][0], y+dir[i][1], dir[i][0], dir[i][1], k+1, c+1);
47         }
48     }
49 }
50 int main()
51 {
52     while(cin >> m >> n, n, m){
53         mini = INF;
54         cnt=0;
55         for(int i = 0; i < n; i++){
56             for(int j = 0; j < m; j++){
57                 cin >> mp[i][j];
58                 if(mp[i][j] == 2) si=i,sj=j;
59                 if(mp[i][j] == 3) gi=i,gj=j;
60             }
61         }
62         dfs(si, sj, 0, 0, 0, 0);
63         if(mini == INF) cout << "-1" << endl;
64         else cout << mini << endl;
65     }
66     return 0;
67 }

原文地址:https://www.cnblogs.com/Surprisezang/p/8988247.html

时间: 2024-10-13 03:13:54

poj3009 Curling 2.0(很好的题 DFS)的相关文章

POJ3009 Curling 2.0(DFS 好题)

Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15262   Accepted: 6334 Description On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is

POJ3009——Curling 2.0(DFS)

Curling 2.0 DescriptionOn Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is played on an ice game board on which a square mesh is marked. They use only a single

poj3009 Curling 2.0 (DFS按直线算步骤)

Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14563   Accepted: 6080 Description On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is

poj3009 Curling 2.0 DFS水

http://poj.org/problem?id=3009 题意:给定一个m*n的网格,在这些网格上一些地方有障碍物,给定起点与终点的位置,当石头从起点开始走,撞上障碍才会转弯,否则会一直沿着来时的方向继续前进.撞到障碍后停在障碍前的位置,障碍消失.然后石头可以选择四个方向(相邻处无障碍的方向)前进,问至少需要停多少次才能从起点到达终点.不能到达或者多余10步后游戏失败.如果能到达输出最少的步数,否则输出-1. 思路:DFS,多余10步为剪枝条件. 1 #include<iostream>

poj3009 Curling 2.0

Description On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is played on an ice game board on which a square mesh is marked. They use only a single stone. The

poj3009 Curling 2.0(DFS回溯)

题目大意是:给你一个球,刚开始是静止的,可以通过触碰给他一个初速度,一旦球运动起来就不会停止,除非遇到一个石头.遇到石头以后小球就原地停止了,然后石头就被砸碎了.小球越界就算失败了.问你最少进行多少次操作,可以让小球到达终点.题中还有一个要求,如果超过10步,就算失败了. 这道题目做了好久啊.可能方法太麻烦了. #include<stdio.h> #include<string.h> int map[105][105],si,sj,ei,ej,w,h; //1 right    2

poj3009 Curling 2.0 深搜

PS:以前看到题目这么长就没写下去了.今天做了半天,没做出来.准备看题解,打开了网站都忍住了,最后还是靠自己做出来的.算是一点进步吧. 分析: 题目的意思没明白或者理解有偏差都没办法做题.看样例3和样例4,数据差不多的,但是一个输出4,但是另外的一个却是-1.再去看题目就会发现,题目的意思是在撞碎石头之前必须走一个为值0的格子.我理解为需要加速.对样例4,答案4是这样出来的:初始位置为(1,3),第一步是到达(1,2),并且使得(1,1)点的值为0(撞碎了这里的石头,0代表可以通行):第二步是到

POJ3009 Curling 2.0(DFS)

迷宫问题求最短路.略有不同的是如果不碰到石头的话会沿着一个方向一直前进,出界就算输了.碰到石头,前方石头会消失,冰壶停在原地.把这个当作状态的转移.DFS可以求出其最小操作数. #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<vector>

POJ3009 Curling 2.0【DFS】

题目链接: http://poj.org/problem?id=3009 题目大意: 一种在宽为M高为N大小的矩阵上玩的冰壶游戏,起点字符为'2',终点字符为'3',矩阵上'0'为可移动区域, '1'为石头区域.冰壶刚开始是静止的,每走一步都会选择某个方向运动,而且会沿着该方向一直运动不停, 也不会改变方向,除非冰壶碰到石头或者到达终点,才会停下(这算一步).冰壶在运动的时候,不能改变方 向.冰壶碰到石头会变成静止状态,这时候石头会破裂,该区域变为可移动区域,而冰壶就可以改变方向了. 冰壶一旦走