P1747 好奇怪的游戏

简介: 《爱与愁的故事第三弹·shopping》娱乐章。

文章目录

一、P1747 好奇怪的游戏

总结


一、P1747 好奇怪的游戏

本题链接:P1747 好奇怪的游戏


题目:


《爱与愁的故事第三弹·shopping》娱乐章。


调调口味来道水题。


题目描述

爱与愁大神坐在公交车上无聊,于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被打上了马赛克)。这个游戏类似象棋,但是只有黑白马各一匹,在点x1,y1和x2,y2上。它们得从点x1,y1和x2,y2走到1,1。这个游戏与普通象棋不同的地方是:马可以走“日”,也可以像象走“田”。现在爱与愁大神想知道两匹马到1,1的最少步数,你能帮他解决这个问题么?


输入格式

第1行:两个整数x1,y1


第2行:两个整数x2,y2


输出格式

第1行:黑马到1,1的步数


第2行:白马到1,1的步数


输入输出样例

输入 #1

12 16

18 10

输出 #1

8

9

说明/提示

100%数据:x1,y1,x2,y2<=20


本博客给出本题截图:

image.png

AC代码

#include <iostream>
#include <algorithm>
#include <cstring>
#define x first
#define y second
using namespace std;
typedef pair <int, int> PII;
const int N = 100, M = N * N;
PII q[M];
bool st[N][N];
int dist[N][N];
int x1, y1, x2, y2;
int bfs(int sx, int sy)
{
    int dx[12] = {-2, -2, -1, 1, 2, 2, 2, 2, 1, -1, -2, -2};
    int dy[12] = {1, 2, 2, 2, 2, 1, -1, -2, -2, -2, -2, -1};
    memset(st, false, sizeof st);
    memset(dist, 0, sizeof dist);
    if (sx == 1 && sy == 1) return 0;
    int hh = 0, tt = 0;
    q[0] = {sx, sy};
    st[sx][sy] = true;
    while (hh <= tt)
    {
        auto t = q[hh ++];
        for (int i = 0; i < 12; i ++ )
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            if (a < 1 || a > 100 || b < 1 || b > 100) continue;
            if (st[a][b]) continue;
            st[a][b] = true;
            dist[a][b] = dist[t.x][t.y] + 1;
            if (a == 1 && b == 1) return dist[a][b];
            q[++ tt] = {a, b};
        }
    }
    return -1;
}
int main()
{
    cin >> x1 >> y1;
    cout << bfs(x1, y1) << endl;
    cin >> x2 >> y2;
    cout << bfs(x2, y2) << endl;
    return 0;
}

当然我们不用st数组其实也是可以的

#include <iostream>
#include <algorithm>
#include <cstring>
#define x first
#define y second
using namespace std;
typedef pair <int, int> PII;
const int N = 100, M = N * N;
PII q[M];
int dist[N][N];
int x1, y1, x2, y2;
int bfs(int sx, int sy)
{
    int dx[12] = {-2, -2, -1, 1, 2, 2, 2, 2, 1, -1, -2, -2};
    int dy[12] = {1, 2, 2, 2, 2, 1, -1, -2, -2, -2, -2, -1};
    memset(dist, -1, sizeof dist);
    if (sx == 1 && sy == 1) return 0;
    int hh = 0, tt = 0;
    q[0] = {sx, sy};
    while (hh <= tt)
    {
        auto t = q[hh ++];
        for (int i = 0; i < 12; i ++ )
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            if (a < 1 || a > 100 || b < 1 || b > 100) continue;
            if (dist[a][b] != -1) continue;
            dist[a][b] = dist[t.x][t.y] + 1;
            if (a == 1 && b == 1) return dist[a][b] + 1;
            q[++ tt] = {a, b};
        }
    }
    return -1;
}
int main()
{
    cin >> x1 >> y1;
    cout << bfs(x1, y1) << endl;
    cin >> x2 >> y2;
    cout << bfs(x2, y2) << endl;
    return 0;
}

总结

bfs板子题,这个题比较狗,没有给棋盘范围,开20的话只能过3个数据,50过8个数据,100才能去全过


目录
相关文章
|
21小时前
|
网络安全 Python
我不善言辞,但还是想教你做个没用的东西
一个可以禁用任意程序的上下行网络的小工具,有倒计时功能
|
2月前
|
移动开发 JavaScript C#
分享31个游戏源代码总有一个是你想要的
分享31个游戏源代码总有一个是你想要的
110 0
|
2月前
|
开发者
当做的游戏没人玩时,还要不要继续做下去了
当做的游戏没人玩时,还要不要继续做下去了
27 0
|
存储 编解码 数据处理
还在为搞不懂笔记本电脑参数而苦恼么?一篇文章就够啦
还在为搞不懂笔记本电脑参数而苦恼么?一篇文章就够啦
245 4
|
开发者
你应该试着独自做个游戏
对于大部分从事游戏开发行业的人,其实并没有机会能够完整的去掌控一个游戏制作的全过程。开发的只负责开发工作,美术的只负责美术工作,大概只有策划能够有机会从整体上了解一个游戏,可能在很多公司中,对于策划也分为很多种,如果只是其中的一种策划,也是没有机会的,唯一一个能够从始至终掌控一个游戏的大概叫做总策划或者叫产品经理。
71 0
|
人工智能 移动开发 数据可视化
不会写代码,想要做游戏
嗨!大家好,我是小蚂蚁。 “我不会写代码,还能做游戏吗?”不少想做游戏的朋友可能都会有这个疑问,答案当然是“能”。 即使不会代码,也并不影响你做游戏。会不会写代码,并不是做游戏的必要条件。 感谢工具的力量,是先进的工具让做游戏这件事对很多人来说成为了可能,下面我就为大家介绍几个不需要写代码,也能够做游戏的工具。
149 0
|
数据挖掘 开发者
关于泡泡龙游戏的一点儿总结,以及分享一个好方法
游戏是一种虚拟的产品,它很难被量化,也很难像工厂流水线生产实体产品一样的去生产。因为其中涉及到的情况太多太杂,如何衡量一个游戏的体量?怎样的游戏算是大游戏,怎样的游戏算是小游戏呢?如何判断一个游戏是做完了还是没有做完呢?如何衡量一个游戏开发者的水平呢?……等等等等。这里面的每一个因素都是一个变量,这么多的无法确定的变量合在一起,想要得到一个确定的结果,很显然是不太可能的。
116 0
|
算法 索引 容器
如何做一个俄罗斯方块游戏(二)
嗨!大家好,我是小蚂蚁。今天我们继续学习如何做一个俄罗斯方块游戏。整个系列教程计划按照这个流程图开展,这也是我制作整个游戏的过程,今天我们就来看一下“随机生成形状”这个模块。想要实现随机的生成形状,首先必须要知道在俄罗斯方块中一共有多少种形状(也就是我们上一节中留下的第二个问题)。
134 0
|
定位技术
你是否还记得有一款游戏叫做“魔塔”?(三)
你是否还记得有一款游戏叫做“魔塔”?
107 0
你是否还记得有一款游戏叫做“魔塔”?(三)
|
Python 内存技术
你是否还记得有一款游戏叫做“魔塔”?(一)
你是否还记得有一款游戏叫做“魔塔”?
337 0
你是否还记得有一款游戏叫做“魔塔”?(一)