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)
上一篇 2022年1月11日 下午8:00
下一篇 2022年1月11日 下午8:00


相关推荐

  • 解密openclaw底层pi-mono架构系列一:5. 让 AI 住进 Slack —— 自我管理的 Slack Bot 智能体详解

    解密openclaw底层pi-mono架构系列一:5. 让 AI 住进 Slack —— 自我管理的 Slack Bot 智能体详解

    2026年3月14日
    3
  • 源码网_python源码从哪下载

    源码网_python源码从哪下载源码目录结构我们首先来看下models.py的代码结构我们可以看到这个模块中定义了12个属性和22个模型类,我们依次来看属性源码分析importosfromenumimportEnu

    2022年7月31日
    14
  • mysql前缀索引及其选择「建议收藏」

    mysql前缀索引及其选择「建议收藏」有时候需要索引很长的字符列,比如BLOB、TEXT或者很长的VARCHAR类型的列,通常可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。

    2022年5月23日
    37
  • java中的scanner是什么_java中的Scanner类是什么?如何使用?「建议收藏」

    java中的scanner是什么_java中的Scanner类是什么?如何使用?「建议收藏」java中的Scanner类是什么?如何使用?发布时间:2020-05-2016:36:48来源:亿速云阅读:204作者:鸽子Scanner类介绍java.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入。创建Scanner对象的基本语法:Scanners=newScanner(System.in);实例:接下来我们演示一个最简单的数据…

    2022年7月8日
    24
  • 免费申请国外免费域名超详细教程

    免费申请国外免费域名超详细教程1.首先申请免费域名网站:https://my.freenom.com/domains.php2.填入域名,这里我们以xcflag为列(尽量选择复杂一点的或者五个字母以上的域名,因为简单的有些域名是需要收费的),点击检查可用性。3.可以看到很多免费的域名(用的谷歌翻译插件,翻译有时候不是很准确,free翻译过来应该是免费而不是自由,之后会写一些关于谷歌插件的笔记,详细讲解)4.我们选择xcflag.tk点击立即获取,稍等一会点击购物车查看绿色按钮5.默认三个月试用,这里下拉框我们选择十二个月

    2022年6月30日
    101
  • 浙江省八年级python_今年9月起 浙江八年级新增Python编程课程「建议收藏」

    浙江省八年级python_今年9月起 浙江八年级新增Python编程课程「建议收藏」今年9月的新学期,浙江三到九年级信息技术课将替换新教材。消息一出,引起浙江学生家长的关注。其中最大的变化是,八年级将新增Python课程内容。新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法按照教材规划五六年级开始接触。昨天,快报记者采访了浙江省教研室,确认了这一消息。相关工作人员表示,目前根据现行的高中教材,对小学、初中的老教材进行了修订,新教材将于今年9月投入使…

    2022年5月13日
    55

发表回复

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

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