首页 > 其他分享 >中国象棋-马-有障碍

中国象棋-马-有障碍

时间:2025-01-15 14:28:00浏览次数:3  
标签:PII 中国象棋 temp int dx 障碍 block

题目

现有一个n∗m​​​​大小的棋盘,在棋盘的第x行第y​​列的位置放置了一个棋子,其他位置中的一部分放置了障碍棋子。棋子的走位参照中国象棋的“马”(障碍棋子将成为“马脚”)。求该棋子到棋盘上每个位置的最小步数。

1:中国象棋中“马”的走位为“日”字形,如下图所示。

中国象棋-马-有障碍_题目描述1.png

2:与“马”直接相邻的棋子会成为“马脚”,“马”不能往以“马”=>“马脚”为长边的方向前进,如下图所示。

中国象棋-马-有障碍_题目描述2.png

思考

利用bfs遍历,最主要的就是处理障碍问题。注意到长边方向前进,前面有障碍的话,就会导致马撇脚。例如上图4*4的棋盘,点坐标为(x,y),马在(2,2),障碍在(3,2),马需要向(1,4)去,则增长量为dx = 2,dy = -1,此时x方向增长量多,即为长边,马在x轴的方向上,有障碍,那么马就不能过去。增量最长也就为2,最小为1,用一个map<PII(坐标),bool> block来存储障碍,所以障碍阻挡了前进的条件判断条件为

block[PII(temp.first + dx[i] / 2,temp.second + dy[i] / 2)]) == true;代表有障碍阻挡了前进方向

!block[PII(temp.first + dx[i] / 2,temp.second + dy[i] / 2)]) == false;代表在前进方向上没有障碍

代码

#include <iostream>
#include <queue>
#include <cstring>
#include <map>

using namespace std;

typedef pair<int,int> PII;

const int N = 110;

int n,m,startX,startY;
int k;
//存储障碍坐标
map<PII,bool> block;

int cnt = 0;
int dx[8] = {-2, -1, 1, 2, -2, -1, 1, 2};
int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};
int ans[N][N];
bool st[N][N];

bool check(int x,int y)
{
    //点不能出界 且 点的位置上不能有障碍 且 点未被访问过
    return x >= 0 && x < n && y >= 0 && y < m && !block[PII(x,y)] && !st[x][y];
}

void bfs(int x,int y)
{
    queue<PII> q;
    q.push({x,y});
    st[x][y] = true;
    ans[x][y] = 0;
    while(!q.empty())
    {
        int size = q.size();
        while(size--)
        {
            PII temp = q.front();
            ans[temp.first][temp.second] = cnt;
            q.pop();
            for(int i = 0;i < 8;i++)
            {
                int nextX = temp.first + dx[i];
                int nextY = temp.second + dy[i];
                //判断点的合法性 且 在长增量上不能有障碍
                if(check(nextX,nextY) && !block[PII(temp.first + dx[i] / 2,temp.second + dy[i] / 2)])
                {
                    st[nextX][nextY] = true;
                    q.push({nextX,nextY});
                }
            }
        }
        cnt++;
    }
}

int main()
{
    cin>>n>>m>>startX>>startY;
    cin>>k;
    for(int i = 0;i < k;i++)
    {
        int x,y;
        cin>>x>>y;
        //存储障碍坐标
        block[PII(x - 1,y - 1)] = true;
    }
    memset(ans,-1,sizeof(ans));

    bfs(startX - 1,startY - 1);

    for(int i = 0;i < n;i++)
        for(int j = 0;j < m;j++)
            if(j == m - 1) cout<<ans[i][j]<<endl;
            else cout<<ans[i][j]<<" ";

    return 0;
}

标签:PII,中国象棋,temp,int,dx,障碍,block
From: https://blog.csdn.net/qq_52806720/article/details/145158922

相关文章

  • 你了解什么是无障碍web(WAI)吗?在开发过程中要怎么做呢?
    无障碍Web(WebAccessibilityInitiative,简称WAI)是由万维网联盟(WorldWideWebConsortium,简称W3C)发起的一个国际性计划,旨在提高网络内容和服务对所有用户的无障碍性,包括残疾人士。该计划制定了一系列指导原则和推荐实践,帮助网站开发者、设计者和内容创作者确保他们的产品对所有人......
  • 中国象棋软件ChineseChess【支持上传棋谱到东萍网站】
    ChineseChess是我用VB6开发的一款中国象棋软件。无需安装,双击打开就可以使用,从XP到Windows10都兼容(如果在Windows7打开失败,请复制到Windows10再试)。软件主界面:残局编辑器:在棋盘中拖放棋子,摆放完成以后,在【文件】菜单中选择红先还是黑先,然后务必点击【返回】F2,否则摆放的残......
  • 【游戏设计原理】53 - 解决问题的障碍
    1.分析并总结原理核心观点游戏本质是一系列问题解决的过程,通过设计巧妙的问题和决策场景,游戏能激发玩家的兴趣和投入感。然而,当问题解决的过程被阻碍时,会降低玩家的体验甚至让他们放弃游戏。文中提到的四种障碍反映了玩家在面对复杂问题时可能遇到的心理和认知问题:功能......
  • 室内障碍物射线追踪算法matlab模拟仿真
    1.算法运行效果图预览(完整程序运行后无水印)   增加发射点   加入室内墙壁:   同时增加发射点和室内墙壁:   2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)%最终显示射线的间隔,如果配置高泽间隔......
  • 排除障碍,解决网站建设代码修改难题
    在网站建设过程中,有时会遇到代码修改无法生效的问题。以下是详细的排查和解决方法:可能原因解决方案缓存问题清除浏览器缓存或尝试在隐身模式下访问网站,排除缓存导致的显示异常。同时,清除服务器端缓存(如Varnish、Memcached)。文件路径错误确认修改的文件路径是否正确......
  • 面向自动驾驶的实时交通场景深度图像分割与障碍物检测系统的设计与实现
    面向自动驾驶的实时交通场景深度图像分割与障碍物检测系统的设计与实现摘要随着自动驾驶技术的快速发展,视觉感知技术成为其中的核心环节之一。本研究设计并实现了基于YOLOv8的实时交通场景障碍物检测与语义分割系统。通过深度学习技术优化模型性能,系统实现了在复杂交通环......
  • 如何做到分库,具体思路设计,无障碍切换库?
    分库设计思路确定分片策略:范围分片:根据某个字段的值范围进行分片,例如按用户的ID范围。哈希分片:使用哈希函数将某个字段的值映射到不同的分片上,例如按用户的ID哈希值。列表分片:将数据按某种列表或集合的方式分片,例如按地域或业务类型分片。数据一致性:确保分库后的数据......
  • HNUST 1497 中国象棋中的跳马问题
    目录题目描述题意思路代码首先吐槽一下,oj的报错让我摸不清头脑。被一个点卡了快两个小时,这也是我写这份题解的原因,希望对你们有用。题目描述题目链接题目描述:现在棋盘的大小不一定,由p,q给出,并且在棋盘中将出现障碍物(限制马的行动,与象棋走法相同)输入描述:第一行输入n表示......
  • 数据采集与传输无障碍 简化设备,解决数据传输 解决隧道深部监测难题 摆脱信号盲区的困
    数据采集与传输无障碍简化设备,解决数据传输解决隧道深部监测难题摆脱信号盲区的困扰根据实际情况和工程环境,我们特别推出了一种一站式现场监测方案,旨在方便快捷地完成隧道深部及信号盲区部分的施工监测。我们利用设备的优势,尽量简化了设备的种类,解决了无信号工况下的数据采集......
  • 毕业设计基于STM32F103C8T6智能小车设计PWM调速、红外循迹、障碍物跟随、超声波避障、
    (页数:61页、字数:14473字)1绪论1.1前言1.2设计任务与要求1.3智能小车硬件设计思路1.3.1智能小车控制板设计思路1.3.2智能小车底板设计思路2单片机的组成及特点2.1单片机的组成2.2单片机的特点2.3STM32F103C8T6单片机介绍2.4STM32F103C8T6单片......