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才能去全过


目录
相关文章
|
4月前
|
移动开发 JavaScript C#
总有一个是你想要的分享31个游戏源代码
该资源分享了31款游戏源代码,包括C#版植物大战僵尸、HTML5版五子棋等,均经过亲测可运行。下载链接中还包含13款游戏源码,适合游戏开发者和爱好者学习参考。作者辛苦整理,希望得到您的点赞与关注作为支持。
156 1
|
8月前
|
移动开发 JavaScript C#
分享31个游戏源代码总有一个是你想要的
分享31个游戏源代码总有一个是你想要的
219 0
|
8月前
|
开发者
当做的游戏没人玩时,还要不要继续做下去了
当做的游戏没人玩时,还要不要继续做下去了
49 0
|
开发者
试着做点儿有趣的事情
一个游戏怎样才算是做完了?这是个因人而异的问题。有些游戏还没有做出来就做完了,因为开发者不想再做了。有的游戏看上去做完了,但是后续还在不停的更新,那我们就说这个游戏其实还没有做完。至于如何算是做完了,我觉得这应该交由该游戏的制作者来决定。
100 0
|
搜索推荐 小程序 程序员
看过很多教程,却依然写不好一个程序,怎么破?
最近在和学员的沟通中,发现不少初学者面临这样一个问题:了解了一些基本的语法,看得懂书上的示例,但是面临一个新的编程问题时,依然感到无从下手。
|
开发者
你应该试着独自做个游戏
对于大部分从事游戏开发行业的人,其实并没有机会能够完整的去掌控一个游戏制作的全过程。开发的只负责开发工作,美术的只负责美术工作,大概只有策划能够有机会从整体上了解一个游戏,可能在很多公司中,对于策划也分为很多种,如果只是其中的一种策划,也是没有机会的,唯一一个能够从始至终掌控一个游戏的大概叫做总策划或者叫产品经理。
98 0
|
人工智能 移动开发 数据可视化
不会写代码,想要做游戏
嗨!大家好,我是小蚂蚁。 “我不会写代码,还能做游戏吗?”不少想做游戏的朋友可能都会有这个疑问,答案当然是“能”。 即使不会代码,也并不影响你做游戏。会不会写代码,并不是做游戏的必要条件。 感谢工具的力量,是先进的工具让做游戏这件事对很多人来说成为了可能,下面我就为大家介绍几个不需要写代码,也能够做游戏的工具。
206 0
|
小程序 开发者
在小游戏之间增加跳转,为自己的游戏带来更多玩家
嗨!大家好,我是小蚂蚁。之前有一篇文章,我的一位学员分享过如何为自己的小游戏起名字,起一个好名字是有可能带来一定的自然搜索流量的。对于个人开发者来讲,流量是一种极其珍贵的东西,直接真金白银的去推广买流量,基本上不现实,所以我们需要尽可能的想办法,获取一些免费的自然流量。
170 0
找不到“妹”字在哪?一款游戏看把你愁的,用我这个代码逻辑,不再被游戏困扰!
找不到“妹”字在哪?一款游戏看把你愁的,用我这个代码逻辑,不再被游戏困扰!
183 0
找不到“妹”字在哪?一款游戏看把你愁的,用我这个代码逻辑,不再被游戏困扰!
|
定位技术
你是否还记得有一款游戏叫做“魔塔”?(三)
你是否还记得有一款游戏叫做“魔塔”?
150 0
你是否还记得有一款游戏叫做“魔塔”?(三)