zoukankan      html  css  js  c++  java
  • 洛谷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所有题!

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

    个性签名:学习使我快乐

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

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

    赞助! 赞助! 赞助!

  • 相关阅读:
    FZU 2112 并查集、欧拉通路
    HDU 5686 斐波那契数列、Java求大数
    Codeforces 675C Money Transfers 思维题
    HDU 5687 字典树插入查找删除
    HDU 1532 最大流模板题
    HDU 5384 字典树、AC自动机
    山科第三届校赛总结
    HDU 2222 AC自动机模板题
    HDU 3911 线段树区间合并、异或取反操作
    CodeForces 615B Longtail Hedgehog
  • 原文地址:https://www.cnblogs.com/laoguantongxiegogo/p/12270988.html
Copyright © 2011-2022 走看看