POJ 3009-Curling 2.0(DFS)

POJ 3009-Curling 2.0(DFS)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

Curling 2.0
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 12158   Accepted: 5125

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 purpose of the game is to lead the stone from the start to the goal with the minimum number of moves.

Fig. 1 shows an example of a game board. Some squares may be occupied with blocks. There are two special squares namely the start and the goal, which are not occupied with blocks. (These two squares are distinct.) Once the stone begins to move, it will proceed until it hits a block. In order to bring the stone to the goal, you may have to stop the stone by hitting it against a block, and throw again.

POJ 3009-Curling 2.0(DFS)
Fig. 1: Example of board (S: start, G: goal)

The movement of the stone obeys the following rules:

  • At the beginning, the stone stands still at the start square.
  • The movements of the stone are restricted to x and y directions. Diagonal moves are prohibited.
  • When the stone stands still, you can make it moving by throwing it. You may throw it to any direction unless it is blocked immediately(Fig. 2(a)).
  • Once thrown, the stone keeps moving to the same direction until one of the following occurs:
    • The stone hits a block (Fig. 2(b), (c)).
      • The stone stops at the square next to the block it hit.
      • The block disappears.
    • The stone gets out of the board.
      • The game ends in failure.
    • The stone reaches the goal square.
      • The stone stops there and the game ends in success.
  • You cannot throw the stone more than 10 times in a game. If the stone does not reach the goal in 10 moves, the game ends in failure.

POJ 3009-Curling 2.0(DFS)
Fig. 2: Stone movements

Under the rules, we would like to know whether the stone at the start can reach the goal and, if yes, the minimum number of moves required.

With the initial configuration shown in Fig. 1, 4 moves are required to bring the stone from the start to the goal. The route is shown in Fig. 3(a). Notice when the stone reaches the goal, the board configuration has changed as in Fig. 3(b).

POJ 3009-Curling 2.0(DFS)
Fig. 3: The solution for Fig. D-1 and the final board configuration

Input

The input is a sequence of datasets. The end of the input is indicated by a line containing two zeros separated by a space. The number of datasets never exceeds 100.

Each dataset is formatted as follows.

the width(=w) and the height(=h) of the board 
First row of the board
 
… 
h-th row of the board

The width and the height of the board satisfy: 2 <= w <= 20, 1 <= h <= 20.

Each line consists of w decimal numbers delimited by a space. The number describes the status of the corresponding square.

0 vacant square
1 block
2 start position
3 goal position

The dataset for Fig. D-1 is as follows:

6 6 
1 0 0 2 1 0 
1 1 0 0 0 0 
0 0 0 0 0 3 
0 0 0 0 0 0 
1 0 0 0 0 1 
0 1 1 1 1 1

Output

For each dataset, print a line having a decimal integer indicating the minimum number of moves along a route from the start to the goal. If there are no such routes, print -1 instead. Each line should not have any character other than this number.

Sample Input

2 1
3 2
6 6
1 0 0 2 1 0
1 1 0 0 0 0
0 0 0 0 0 3
0 0 0 0 0 0
1 0 0 0 0 1
0 1 1 1 1 1
6 1
1 1 2 1 1 3
6 1
1 0 2 1 1 3
12 1
2 0 1 1 1 1 1 1 1 1 1 3
13 1
2 0 1 1 1 1 1 1 1 1 1 1 3
0 0

Sample Output

1
4
-1
4
10
-1
写到吐啊有木有。。
题意: 给一张地图。2为起点,3为终点,有一个冰壶,从起点開始滑行。碰到石头(1)停止,这样算1步。越界算失败,问滑到终点最少多少步。到不了终点输出-1;
然后DFS就能够了。

。。悲剧的是地图要初始化。不然会wa到死。

。尽管如今还是不明确地图为什么非要初始化,可能是搜索过程中开全局变量会变异?

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cctype>
#include <vector>
#include <cstdio>
#include <cmath>
#include <deque>
#include <stack>
#include <map>
#include <set>
#define ll long long
#define maxn 116
#define pp pair<int,int>
#define INF 0x3f3f3f3f
#define max(x,y) ( ((x) > (y)) ?

(x) : (y) )#define min(x,y) ( ((x) > (y)) ?

(y) : (x) )using namespace std;int n, m, ans, sx, sy;int ma[24][24];int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, { -1, 0}};void dfs(int x, int y, int step){ if (step >= 10) { return ; } if (step >= ans) { return ; } for (int i = 0; i < 4; i++) { int tx = dir[i][0] + x; int ty = dir[i][1] + y; if (tx >= 1 && tx <= m && ty >= 1 && ty <= n && ma[tx][ty] != 1) { while (tx >= 1 && ty >= 1 && tx <= m && ty <= n && ma[tx][ty] != 1 && ma[tx][ty] != 3) { tx += dir[i][0]; ty += dir[i][1]; } if ((tx == 1 || ty == 1 || tx == m || ty == n) && ma[tx][ty] == 0) { continue; } if (ma[tx][ty] == 3) { ans = min(ans, step + 1); return ; } if (ma[tx][ty] == 1) { ma[tx][ty] = 0; dfs(tx - dir[i][0], ty - dir[i][1], step + 1); ma[tx][ty] = 1; } } }}int main(){ while (scanf("%d %d", &n, &m) != EOF) { if (!n && !m) { break; } memset(ma, 0, sizeof(ma)); for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) { scanf("%d", &ma[i][j]); if (ma[i][j] == 2) { sx = i; sy = j; } } ans = INF; dfs(sx, sy, 0); if (ans != INF) { printf("%d\n", ans); } else { puts("-1"); } } return 0;}

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117032.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux vi 替换命令_vi替换命令转移

    linux vi 替换命令_vi替换命令转移原文地址:http://www.cnblogs.com/afant/archive/2009/03/11/1408745.html:s/^.*$/\L&/100#将100行内的小写转换成大写vi/vim中可以使用:s命令来替换字符串。:s/vivian/sky/替换当前行第一个vivian为sky:s/vivian/sky/g替换当前行所有vi

    2022年9月22日
    1
  • 数据库防注入_Spring中依赖注入的四种方式

    数据库防注入_Spring中依赖注入的四种方式方法一:摘自https://www.cnblogs.com/yuanchaoyong/p/7243492.htmlFilter拦截包装request->创建过滤器->添加过滤器通过扩展HttpServletRequestWrapper,对HttpServletRequest进行二次包装,覆盖其publicString[]getParameterValues(String…

    2025年7月14日
    0
  • linux的文件名的长度限制_linux补全文件名

    linux的文件名的长度限制_linux补全文件名linux下文件数、目录数、文件名长度的各种限制一、文档目的编写本文档,主要目的是为了验证linux下文件数、目录数、文件名长度的各种限制二、文档内容以下测试都是在没有优化或修改内核的前提下测试的结果1.ext3文件系统下filename最大字符长度测试目的:ext3文件系统下filename最大字符长度测试平台:CENTOS5.4_32测试过程:LENTH=`foriin{1..255}…

    2022年10月21日
    0
  • mysql 多表删除

    mysql 多表删除

    2022年3月13日
    60
  • 1077. 皇宫看守(树形dp)[通俗易懂]

    1077. 皇宫看守(树形dp)[通俗易懂]太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫。皇宫各个宫殿的分布,呈一棵树的形状,宫殿可视为树中结点,两个宫殿之间如果存在道路直接相连,则该道路视为树中的一条边。已知,在一个宫殿镇守的守卫不仅能够观察到本宫殿的状况,还能观察到与该宫殿直接存在道路相连的其他宫殿的状况。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少。

    2022年8月9日
    5
  • pycharm一键调整代码格式_pycharm community怎么改成中文

    pycharm一键调整代码格式_pycharm community怎么改成中文用pycharm真的很久了,一直是英文的IDE,还是感到不太方便。在网上找如何将pycharm汉化,结果搜出来的结果都是下载补丁?或者是激活成功教程版?风险很大。于是自己摸索出了这个官方汉化版的操作,绝对安全,绝对简便!!打开settings(设置),然后在里面搜索plugins(插件)。 进入界面之后,点击中上方的marketplace(市场),搜索”chinese”。 弹出来的第一个,作者是JetBrains官方出的插件,点击安装。 重启之后,界面就变成下图的汉化版了!!超级方便,超级安全!!

    2022年8月25日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号