首页 > 其他分享 >马的遍历

马的遍历

时间:2022-08-24 14:39:56浏览次数:43  
标签:Node map 遍历 int xx front 步数

马的遍历

思路:首先要知道马走日字,可以走8个方向.

建立数组a和数组b,分别表示马一步可以走的横纵坐标的对应长度。

然后从马的起始位置(队首)开始向周围扩展,并依次记录步数。若扩展到的点在棋盘里且没有被搜到过,就入列。

当队首向外扩展完了,让当前队首出队,再由下一个队首继续向外扩展寻找.最后如果没被搜到的点输出-1。

代码如下:

#include<iostream>

#include<queue>

#include<cstdio>

using namespace std;

const int N=410;

int n,m,sx,sy;

int map[N][N];//存放棋盘中每点到达步数,还有判重功能

int dx[8]={1,1,-1,-1,2,2,-2,-2};

int dy[8]={2,-2,2,-2,1,-1,1,-1};//围棋马能走的八个方向

/*或者开一个二维数组int dd[8][2]={{1,2},{1,-2},{-1,2}....}

dd[][0]就等于dx[];dd[][1]就等于dy[] */

struct Node{

    int x;

    int y;

    int step;

};//将每个点的位置和达到所用步数打包成Node类型(结构体)

 

int main(){

    cin>>n>>m>>sx>>sy;

    queue<Node>Q;//定义一个Node类型的队列 ,放点

    Q.push((Node){sx,sy,0});//将初始点信息压进队首

   

    for(int i=1;i<=n;i++){   

     for(int j=1;j<=m;j++)

        map[i][j]=-1;

    }//将棋盘步数都变成-1,走不到的点就会一直是-1

   

        map[sx][sy]=0;//从初始点出发广搜,将初始点步数变成0

       

    while(!Q.empty()){//当队列不为空时,开始bfs

        for(int i=0;i<8;i++){//八个方向广搜

            int xx=Q.front().x+dx[i];//Q.front()返回第一个元素

            int yy=Q.front().y+dy[i];

            if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&map[xx][yy]==-1)//如果搜到的点在棋盘里且没有被搜到过  在边界内

            {    Q.push((Node){xx,yy,Q.front().step+1});//将能走到的点压入队列

                map[xx][yy]=Q.front().step+1;//步数更新

             }

       

        }

        Q.pop();//当队首的下一层可以走到的点全部放入队列后,队首(起始点)踢出

    }

    for(int i=1;i<=n;i++){//按格式输出

        for(int j=1;j<=m;j++)

          printf("%5d",map[i][j]);

        printf("\n");

    }

    return 0;

}

标签:Node,map,遍历,int,xx,front,步数
From: https://www.cnblogs.com/xdzxyingrui/p/16619751.html

相关文章

  • 马的遍历
    开始把马的起点入队,当前节点为马的起点,再把马走日字的几个新节点入队,拓展新节点后就能把当前节点出队。从当前节点开始,走日字的各个节点不超过边界且未曾访问则是能入队的......
  • leetcode 热题100刷题-二叉树的中序遍历
    题题号:94题目:二叉树的中序遍历难度:简单链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/2022/08/23答案算法思路  本题在课程中是学过的。  ......
  • 7-1 顺序表的建立及遍历
    7-1顺序表的建立及遍历分数30作者陈晓梅单位广东外语外贸大学读入n值及n个整数,建立顺序表并遍历输出。输入格式:读入n及n个整数输出格式:输出n个整数,以空格分......
  • JQuery_遍历_for循环、JQuery_遍历2_each方法
    JQuery_遍历_for循环2.遍历1.js的遍历方式*for(初始化值;循环结束条件;步长)2.jq的遍历方式1.jq对象.each(callback)2.$.each(object,[callback])3.for..of: ......
  • 算法---二叉树的前序遍历
    知识点树递归dfs广度优先搜索(BFS)描述给你二叉树的根节点root,返回它节点值的前序遍历。数据范围:二叉树的节点数量满足0≤n≤100 0\len\le100\0≤......
  • JMeter While循环控制器应用之遍历获取文件参数
    While循环控制器应用之遍历获取文件参数by:授客QQ:1033553122测试环境JMeter-5.4.1应用实现单线程在单次迭代内遍历获取文件参数说明:上图仅给出关键配置信息注意:......
  • 二叉树遍历方法总结
    二叉树基本概念面试的时候提到的树,大部分都是二叉树.所谓二叉树是树的一种特殊结构,在二叉树中每个节点最多只能有两个子节点,在二叉树中最重要的操作莫过于遍历,即......
  • 102.binary-tree-level-order-traversal 二叉树的层序遍历
    利用queue先进先出的特性进行处理,利用queue.size()来识别元素是否在二叉树的同一层,同时要注意不能直接i<q.size()来判断,因为q.size()是不断变化的。classSolution{......
  • 107.binary-tree-level-order-traversal-ii 二叉树的层序遍历II
    参考102.binary-tree-level-order-traversal二叉树的层序遍历,翻转一下结果数组就好了。classSolution{public:vector<vector<int>>levelOrderBottom(TreeNode......
  • 二叉树的统一迭代法遍历
    中序遍历中序遍历无法直接利用栈进行遍历,需要利用指针进行遍历,对栈中的节点进行操作。对于中间节点,如果指针遍历到了,但没有进行处理,就再push()一个nullptr,作为标记,说明这......