首页 > 其他分享 >Curling 2.0

Curling 2.0

时间:2023-05-04 17:00:42浏览次数:37  
标签:stone goal int board 石头 Fig 2.0 Curling

 

G - Curling 2.0

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.


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.


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).


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

Inputcopy Outputcopy
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
1
4
-1
4
10
-1

中文:

Descriptions:

今年的奥运会之后,在行星mm-21上冰壶越来越受欢迎。但是规则和我们的有点不同。这个游戏是在一个冰游戏板上玩的,上面有一个正方形网格。他们只用一块石头。游戏的目的是让石子从起点到终点,并且移动的次数最小

图1显示了一个游戏板的例子。一些正方形格子可能被砖块占据。有两个特殊的格子,起始点和目标点,这是不占用块。(这两个方块是不同的)一旦石头开始移动就不会停下,除非它击中砖块块。为了使石头到达终点,你可以通过让石块击中墙壁或者砖块来停下。

图1:例子(S:开始,G:目标)

石头的运动遵循以下规则:

  • 开始时,石头静止起点广场上。
  • 石头的运动仅限于x和y方向。禁止对角线移动。
  • 当石头静止时,你可以让他向任意方向移动,除非它移动的方向上有砖块(图2(a))。
  • 一旦抛出,石头不断向同一方向移动,直到下列事件之一发生:
    • 石头击中砖块(图2(b),(c))。.
      • 石头停在他击中的砖块之前
      • 被击中的砖块消失
    • 石块飞出游戏板之外。
      • 游戏结束的条件
    • 到达目标点
      • 石头停在目标点游戏成功
  • 不能在十步之内到达目标点则返回失败。

Fig. 2: Stone movements

通过这些规则我们想知道,石头是否能够到达目标点和最少移动次数

初始配置如图1所示,石头从开始到目标需要4次移动。路线如图3所示(a)。注意当石头到达目标时,游戏版的配置如图3(b)改变。

图3:图1的解决方案和解决之后的结果。

Input

输入是一组数据。输入结束标志为两个0。数据组的数量不超过100。

每个数据集如下展示

板的宽度(w)和高度(h) 
游戏版的第一行 
... 
游戏版的h-th行

版的宽和高满足: 2 <= w <= 20, 1 <= h <= 20.

每行由一个空格分隔的十进制数字组成。该数字描述相应的格子的状态。

1 砖块

2 开始点

3 目标点

图. D-1数据如下:

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

对于每个数据,打印一个十进制整数的行,表示从开始到目标的路径的最小移动次数。如果没有这样的路线,打印- 1。每个行不应该有这个数字以外的任何字符。

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

 

题解:

很明显的,dfs搜索,但是方向数组(一开始是一格一格走的现在改为一条一条走(个人觉得好像就是这么一点区别)),然后呢,就是注意一下条件的判断加上回溯和剪枝就行啦!

上代码!!!

#include<iostream>
using namespace std;
int m[30][30];
int w, h;
int ans = 100;
int dx[] = { 1,-1,0,0 };
int dy[] = { 0,0,1,-1 };//方向数组
void dfs(int x, int y,int t)
{
	if (m[x][y] == 3)//终点
	{
		ans = min(t, ans);
		return;
	}
	if (t >= 10 || t >ans)
		return;//剪枝,减少没必要的递归
	for (int i = 0; i < 4; i++)
	{
		int x1 = x + dx[i];
		int y1 = y + dy[i];
		if (m[x1][y1] == 1||x1<1||y1<1||x1>h||y1>w)//不能走的情况
			continue;
		while (x1 >=1 && x1 <= h&& y1 >=1 && y1 <= w && m[x1][y1] != 1)
		{
			if (m[x1][y1] == 3)//到终点的情况
			{
				t++;
				ans = min(t, ans);
				return;
			}
				x1 += dx[i];
				y1 += dy[i];//没到终点就一直走
		}
		if (x1<1 || y1<1 || x1>h || y1>w)//出界
			continue;
		t++;
		m[x1][y1] = 0;//撞墙了,墙破
		dfs(x1-dx[i], y1-dy[i], t);
		t--;
		m[x1][y1] = 1;//回溯
	}
}
int main()
{
	int x = 0;
	int y = 0;
	for (;;)
	{
		cin >> w >> h;
		if (h == 0 && w == 0)
			break;
		else
			for (int i = 1; i <= h; i++)
			{
				for (int j = 1; j <= w; j++)
				{
					cin >> m[i][j];
					if (m[i][j] == 2)//起点的位置
					{
						x = i;
						y = j;
					}
				}
			}
		dfs(x, y, 0);
		if (ans > 10)
			ans = -1;
		cout << ans << endl;
		ans = 100;
		for (int i = 1; i <= h; i++)
		{
			for (int j = 1; j <= w; j++)
				m[i][j] = 0;//初始化数组
		}
	}
	return 0;
}

最后的最后,祝各位题题ac,比赛ak!

标签:stone,goal,int,board,石头,Fig,2.0,Curling
From: https://www.cnblogs.com/haggard/p/17371784.html

相关文章

  • Ubuntu22.04 rc-local 配置开机自启动脚本
    1.rc-local服务简介Linux中的rc-local服务是一个开机自动启动的,调用开发人员或系统管理员编写的可执行脚本或命令的,它的启动顺序是在系统所有服务加载完成之后执行。ubuntu22.04系统已经默认安装了rc-local.service服务,但是不知什么原因系统把这个服务给“隐蔽”了,所以如果不做......
  • 面试题 02.07(Java). 链表相交(简单)
    题目:本题与:力扣160相交链表一致给你两个单链表的头节点 headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两个链表在节点c1开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构......
  • 工控机中部署Ubuntu 22.04 系统
    1.下载Ubuntu系统服务器版本获取Ubuntu服务器版|Ubuntu 2.下载启动盘制作工具UltralSO(试用就可以)文件>打开(Ubuntu.ISO)>启动>(盾牌)写入硬盘映像>等待完成 3.进入BIOS界面设置U盘启动方法一:win10设置>重置此电脑>立即重启>疑难解答>高级选项>......
  • Azure DevOps Server 2022.0.1升级手册
    Contents1.概述2.操作方法2.1安装操作系统2.2安装数据库2.4还原数据2.3安装和配置AzureDevOpsServer1.概述AzureDevOpsServer是微软公司经过20多年的持续开发,逐渐将需求管理、敏捷实践、源代码管理、持续集成等功能集成一体,实现应用软件生命周期全流程服务的技术平台,......
  • 沁恒 CH32V208(三): CH32V208 Ubuntu22.04 Makefile VSCode环境配置
    目录沁恒CH32V208(一):CH32V208WBU6评估板上手报告和Win10环境配置沁恒CH32V208(二):CH32V208的储存结构,启动模式和时钟沁恒CH32V208(三):CH32V208Ubuntu22.04MakefileVSCode环境配置硬件部分CH32V208WBU6评估板WCH-LinkE或WCH-Link硬件环境与Windows下......
  • Ubuntu 22.04 开启SSH
    1.更新源sudoaptupdate&&sudoaptupgrade-y2.安装SSH(OpenSSH)sudoaptinstallopenssh-server-y3.使用systemctl启动SSH服务sudosystemctlenable--nowssh4.检查ssh状态sudosystemctlstatusssh5.检查防火墙状态sudoufwstatus6.防火墙放行SSH端口......
  • Vue2.0和3.0区别
    一、项目初始化2.0初始化,vueinit<模板名称(webpack比较常用)>[项目名称]vueinitwebpackcli2-test3.0初始化,vuecreate[项目名称]vuecreatecli3-test二、目录结构对比2.0目录结构 3.0目录结构 3.0版本中项目环境变量配置文件没有了(dev.env.js/prod.env.js......
  • Vue2.0版本升级到vue3.0
    vue版本的升级主要步骤:一、首先需要卸载你之前的vue2.0版本输入cmd–>回车–>进入dos界面输入命令查询vue的版本:vue-Vorvue-Version输入命令卸载目前vue版本:npmuninstall-gvue-cli再输入vue版本查询命令,提示“不是可执行的命令”则表示卸载成功了。二、安装新......
  • Ubuntu 22.04 SSH the RSA key isn't working since upgrading from 20.04
    Ubuntu22.04SSHtheRSAkeyisn'tworkingsinceupgradingfrom20.04UpuntillastweekIwasrunningUbuntu20.04happily,andthenovertheweekenddecidedtobackeverythingupandinstall22.04.I'vehadacoupleofteethingissueswhichI&#......
  • JAVA+MySQL做一个图书信息管理系统【二次开发】【更新版2.0】【纯java】、Java技术分
    JAVA+MySQL做一个图书信息管理系统【二次开发】【更新版2.0】【纯java】Java技术分享Java技术er集合啦!大家可分享关于Java技术知识,包括但不限于微服务,分布式等前沿技术,快来沉淀自己的技术,一起写出未来吧!你可以从以下几个方面着手(不强制),或者根据自己对话题主题的理解进行创作,参考如......