• 洛谷P1443 马的遍历


    题目描述

    有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步

    输入格式

    一行四个数据,棋盘的大小和马的坐标

    输出格式

    一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)

    输入输出样例

    输入:                                                   输出:
    3 3 1 1                                                0    3    2
                                                           3    -1   1
                                                           2    1    4

    下面正式进入题解内容


    这道题目我用的是广度优先搜索(BFS)

    首先要输入马的位置(当我没说)

    然后就是要考虑马的八个方向;

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

    我们都知道,广度优先搜索利用的是队列,所以我们先建立队列:

    qx[]表示队列,head表示队列头,tail表示队列尾。


    下面开始正常操作:

    1.将元素放入队列尾;

    2.循环:当队列头不等于队列尾时循环。

    3.取出队列头。

    4.按八个方向从马的坐标向外延伸。

    5.将可以最先落脚的地方标记,并记录步数。

    6.将这个点放入队列头。

    好了,就这么简单

    下面是BFS部分的代码:(未经修改,放心食用)

     1 void bfs(int x,int y)
     2 {
     3     head=0;tail=0;
     4     qx[++tail]=x,qy[tail]=y;
     5     ans[x][y]=0;
     6     used[x][y]=1;
     7     while(head!=tail)
     8     {
     9         int x=qx[++head],y=qy[head];
    10         for(int i=0;i<8;i++)
    11         {
    12             int nx=x+dx[i],ny=y+dy[i];
    13             if(nx>=1&&nx<=n&&ny>=1&&ny<=m)
    14             {
    15                 if(used[nx][ny]==0)
    16                 {
    17                     used[nx][ny]=1;
    18                     ans[nx][ny]=ans[x][y]+1;
    19                     qx[++tail]=nx,qy[tail]=ny;
    20                 }
    21             }
    22         }
    23     }
    24 }

    输入输出问题就不必说了。

    但要注意题目要求输出左对齐,宽5格(不能用空格!


    题目完整代码如下:(经过部分修改,禁止复制粘贴)

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 using namespace std;
     6 int dx[10]={1,2,2,1,-1,-2,-2,-1};
     7 int dy[10]={2,1,-1,-2,-2,-1,1,2};
     8 int head,tail,ans[500][500],qx[16000000001],qy[16000000001],n,m,nx,ny;
     9 bool used[1000][1000];
    10 void dfs(int x,int y)
    11 {
    12     head=0 tail=0;
    13     qx[++tail]=x,qy[tail]=y;
    14     ans[x][y]=0;
    15     used[x][y]=1;
    16     while(head!=tail)
    17     {
    18         int x=qx[++head],y=qy[head];
    19         for(int i=0;i<8;i++)
    20         {
    21             int nx=x+dx[i],ny=y+dy[i];
    22             if(nx>=1&&nx<=n&&ny>=1&&ny<=m)
    23             {
    24                 if(used[nx][ny]==0)
    25                 {
    26                     used[nx][ny]=1;27                     ans[nx][ny]=ans[x][y]+1;28                     qx[++tail]=nx,qy[tail]=ny;
    29                 }
    30             }
    31         }
    32     }
    33 }
    34 int main()
    35 {
    36     int x,y;
    37     cin>>n>>m;
    38     for(int i=0;i<n;i++)
    39     {
    40         for(int j=1;j<=m;j++)
    41         {
    42             ans[i][j]=-1;
    43         }
    44     }
    45     cin>>x>>y;
    46     bfs(x,y);
    47     for(int i=1;i<=n;i++)
    48     {
    49         for(int j=1;j<=m;j++)
    50             printf("%d",ans[i][j]);
    51         cout<<endl;
    52     }
    53     return 0;//不写return 0,考试就爆零
    54 }

    最后本蒟蒻祝福大家:

    AC所有题!

    -------------------------------------------

    个性签名:学习使我快乐

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

    博主最近五行缺钱,请求精准扶贫

    赞助! 赞助! 赞助!

  • 相关阅读:
    win7下 不支持DOS全屏 This system does not support fullscreen mode
    C语言 猜字游戏
    C语言 寻找字符串的第一个小写字母
    getch 函数 当ubuntu下没有curses.h下怎么办?
    C语言 将小写字母写入文件
    vc++读取文件属性的详细信息描述 读取QQ的注册表路径
    C语言 输入字符写入文件再计算文件里的大写字母个数
    #define STRICT 让编译器进行严格类型检查
    HDU1875 畅通工程再续
    HDU4146 Flip Game
  • 原文地址:https://www.cnblogs.com/laoguantongxiegogo/p/12270988.html
Copyright © 2020-2023  润新知