小X与机器人 (betago) 题解

题目描述

小 X 最近对战胜韩国围棋大神李世石的 AlphaGo 很感兴趣,所以小 X 自己写了一个叫 做 BetaGo的人工智能程序(简称 AI) , 这个 BetaGo 会做什么呢?

小 X 首先想要让 BetaGo 做到自己在棋盘上落子, 这一点 AlphaGo 是由程序员来完成的。小 X 的设想是这样的: 在棋盘的边框上放置一个小机器人, 这个小机器人会沿着棋盘的边框移动到最接近落子点的位置,然后伸出它的机械臂将棋子放到棋盘上。 这里面最关键的一步是如何让小机器人在棋盘的边框上沿着最短的路径移动,小 X 想请你帮他编个程序解决这个问题。

众所周知,围棋棋盘大小为 19 ×  19(如下图所示) , 图中加粗的一圈即为边框。

我们用一对整数 (x, y) 来表示棋盘上第 x 条横线(从下往上数)与第 y 条竖线(从左往右数)的交叉点,如上图中边框上的 A 点用( 6, 1) 表示, B 点用 (10, 19) 表示,小机器人初始时放置在 (x1,y1) 这个位置上, 它想要移动到 (x2, y2) 这个位置上。 (x1, y1) 和(x2, y2) 一定是棋盘边框上的交叉点每一步小机器人可以从当前位置移动到相邻(上下左右)的某个位置上, 即每次可以从 (x, y) 移动到 (x - 1, y) 、 (x + 1, y) 、 (x, y - 1) 、 (x, y + 1) 四个位置中的一个, 但是它不能走出或走进棋盘,也就是说它只能沿着棋盘的边框移动到相邻位置, 这就意味着任一时刻相邻位置都恰好只有两个。

BetaGo 会告诉小机器人最少需要走多少步, 但小 X 还是很担心 BetaGo 有的时候会失控,从而告诉他一个错误值。

为此小 X 只好求助你, 希望你编一个程序计算从 (x1, y1) 沿着棋盘的边框移动到 (x2, y2) 最少需 要 走 多 少步 。 上 图 中 从 A 点 ( 6 , 1 ) 移 动 到 B 点 (10 , 19) 最 少需 要 走 32 步 , 移 动 路线 是 :( 6 , 1 ) → ( 5 , 1 ) → ( 4 , 1 ) → ( 3 , 1 ) → ( 2 , 1 ) → ( 1 , 1 ) → (1 , 2 ) → (1 , 3 ) →……→(1, 19) →(2, 19) →……→(10, 19)

输入

输入数据仅有一行包含四个用空格隔开的正整数表示 x1, y1, x2, y2。

数据保证 (x1, y1) , (x2, y2) 一定是棋盘边框上的交叉点。

输出

输出一行包含一个整数 ans, 表示小机器人从 (x1, y1) 移动到 (x2, y2) 的最少步数。

样例输入

6 1 10 19

样例输出

32

【数据范围】

对于 30%的数据, (x1, y1) , (x2, y2) 在同一条边框上

对于另外 30%的数据, (x1, y1) , (x2, y2) 在相邻的两条边框上

对于另外 40%的数据, (x1, y1) , (x2, y2) 在相对的两条边框上

时间限制:1s

空间限制:256M

题解

方法一:分类讨论

三种情况:

(1)对面两个点,要分两路比较

(2)相邻直线上的两个点(x横坐标y纵坐标)abs(x1-x2)+abs(y1-y2)

(3)同一条线上abs(x1-x2)或abs(y1-y2)

参考代码

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 using namespace std;
 4 int solve(int x,int y){
 5     if(x-y>=0) return x-y;
 6     return y-x;
 7 }
 8 signed main()
 9 {
10     //freopen(".in","r",stdin);
11     //freopen(".out","w",stdout);
12     int x1,y1,x2,y2,a,b;
13     scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
14     if(abs(x1-x2)==18){
15         a=18+y1-1+y2-1;
16         b=18+19-y1+19-y2;
17     }
18     else if(abs(y1-y2)==18){
19         a=18+x1-1+x2-1;
20         b=18+19-x1+19-x2;
21     }
22     else if(x1==x2) a=solve(y1,y2);
23     else if(y1==y2) a=solve(x1,x2);
24     else a=solve(x1,x2)+solve(y1,y2);
25     if((a>b)&&(b!=0)) printf("%lld\n",b);
26     else printf("%lld\n",a);
27     return 0;
28 }

方法二:广度优先搜索(BFS)

参考代码

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 using namespace std;
 4 queue<int>x,y,sum;
 5 int vis[20][20],sx,sy,tx,ty,xx,yy,summ;
 6 signed main()
 7 {
 8     //freopen(".in","r",stdin);
 9     //freopen(".out","w",stdout);
10     scanf("%lld%lld%lld%lld",&sx,&sy,&tx,&ty);
11     if(sx==tx&&sy==ty){
12         printf("0\n");
13         return 0;
14     }
15     x.push(sx),y.push(sy),sum.push(0);
16     while(!x.empty()){
17         xx=x.front(),yy=y.front(),summ=sum.front();
18         vis[xx][yy]=summ;
19         if(xx==1||xx==19){
20             if(yy<19&&vis[xx][yy+1]==0)
21                 x.push(xx),y.push(yy+1),sum.push(summ+1);
22             if(yy>1&&vis[xx][yy-1]==0)
23                 x.push(xx),y.push(yy-1),sum.push(summ+1);
24         }
25         if(yy==1||yy==19){
26             if(xx<19&&vis[xx+1][yy]==0)
27                 x.push(xx+1),y.push(yy),sum.push(summ+1);
28             if(xx>1&&vis[xx-1][yy]==0)
29                 x.push(xx-1),y.push(yy),sum.push(summ+1);
30         }
31         if(xx==sx&&yy==sy) vis[xx][yy]=1;
32         x.pop(),y.pop(),sum.pop();
33     }
34     printf("%lld\n",vis[tx][ty]);
35     return 0;
36 }

原文地址:https://www.cnblogs.com/maoyiting/p/betago.html

时间: 2024-10-11 21:06:54

小X与机器人 (betago) 题解的相关文章

2778: 【入门】小 X 与机器人 (betago)

题目: 时间限制 : 1 Sec 内存限制 : 32 Mb 提交 : 943 解决 : 253 题目描述 小 X 最近对战胜韩国围棋大神李世石的 AlphaGo 很感兴趣,所以小 X 自己写了一个叫 做 BetaGo的人工智能程序(简称 AI) , 这个 BetaGo 会做什么呢? 小 X 首先想要让 BetaGo 做到自己在棋盘上落子, 这一点 AlphaGo 是由程序员来完成的.小 X 的设想是这样的: 在棋盘的边框上放置一个小机器人, 这个小机器人会沿着棋盘的边框移动到最接近落子点的位置,

2779: 【基础】小 X 与机器人 2 (sihuo)

题目: 时间限制 : 1 Sec 内存限制 : 32 Mb 提交 : 439 解决 : 178 题目描述 小 X 在解决了高大上的落子问题后, 开始着手训练 BetaGo 的深度学习 能力, 第一步要教 BetaGo识别各种各样的棋形,小 X 首先教 BetaGo 识别跟死活密切相关的棋型,在成功识别了一些简单的棋形后, BetaGo 在识别聚四棋形时遇到了困难,所谓聚四棋形就是连在一起的四颗棋子, 它们共有五种不同的形状, 五种棋形及其命名如下图所示: 注意: 每种形状经过旋转.翻折得到的图案

开源项目——小Q聊天机器人V1.4

小Q聊天机器人V1.0 小Q聊天机器人V1.1 小Q聊天机器人V1.2 小Q聊天机器人V1.3 GitHub:https://github.com/baiyuliang/QRobot V1.4版本中,对来聊天界面不同消息布局进行了优化,使得聊天消息类型的扩展性更强!1.4之前的版本我们知道,我是将各种消息类型布局全部集中在了一个xml中,这种方式对少量消息类型的应用还可以,如果消息类型过多,那么这种方式就显得很low了,而且影响性能!1.4版本中,将各种消息类型逐一拆分(并且发送和接收一一对应)

《中小企业如何用小帮软件机器人提高工作效率?》

以数字化为标志,以智能化为特征的新一代商业变革已经到来.信息技术的创新发展,必然引发商业模式的变革,使得营销.运营.人力.财务策略和运作流程发生变化.在数字化.自动化.智能化的趋势下,软件机器人.人工智能(AI).大数据和云计算等新技术被应用到企业的方方面面,使企业流程不断优化.效率不断提升. 什么是软件机器人? 软件机器人是一种智能化软件,通过模拟并增强人类与计算机的交互过程,实现工作流程中的自动化. 比如说很多办公流程,工作人员经常需要耗费大量的时间来操作一些重复性的有规律的工作,那么这些任

开源项目之小玩具---各种机器人开源硬件

一些小玩具的网站 作者: doskey 日期: 2012 年 10 月 10 日1 条评论 TinkerForge - http://www.tinkerforge.com一个开源机器人的网站.Made In Germany.东西很好只是太贵. Arduino – http://www.arduino.cc著名的开源电路项目.价格不便宜.适合爱折腾的同学. Raspberry Pi – http://www.raspberrypi.org现在最火爆的开源电路板——树莓派.东西便宜,可玩性高,但是

Simsimi 小黄鸡机器人最新无限制接口api simsimi机器人接口api 微信公众号

一.什么是Simsimi? simsimi公司是提供智能服务,其中一个服务是simsimi聊天机器人服务,每天有超过百万的用户聊天,国内最大的搜索引擎——百度的产品siri使用的就是simsimi提供的api. 你可以在网址http://www.simsimi.com/talk.htm# 进行体验 SimSimi inc. is specialized in collective intelligence service. All kinds of services we provide gen

【算法学习笔记】73.数学规律题 SJTU OJ 1058 小M的机器人

Description 小M有很多个机器人,他们要么一直说真话,要么一直说假话. 然后每个人都说: (1). 不到N个人比我工作得多 (2). 至少M个人的工资比我高. 保证没有两个人的工作一样重,也没有两个人的工资一样高,问至少有多少机器人? Input Format 一行两个数整数N, M (  1≤N,M < 2^31) Output Format 一个整数K表示至少有K个人 Hint 想不出来的同学... 不要想得太复杂了... Sample Input 2 2 Sample Outpu

小Y的棋盘问题 题解

有一个n*m的棋盘,上面有一些棋子,每行每列最多只会有一个棋子,不会有两个棋子八连通.问随机一个空格子作为起点,再随机地选择一个空格子作为终点,求问不经过任意棋子最短路的期望长度是多少.多组,n,m<=2000. 首先答案分子显然是所有点对距离之和,分母就是不是棋子的位置个数的平方. 假装没有棋子,那么距离就是曼哈顿距离了.那么我们可以考虑将x项和y项分开统计,所以只要按x.y坐标顺序枚举点即可. 现在有了棋子,我们考虑哪些东西会受到影响. ①同一行/同一列的被棋子隔开,这样肯定距离要加2. ②

【luogu P1494 [国家集训队]小Z的袜子】 题解

题目链接:https://www.luogu.org/problemnew/show/P1494 #include <cstdio> #include <algorithm> #include <iostream> #include <cmath> using namespace std; const int maxn = 50000+10; inline long long read() { long long k=0; char c; c=getchar