zoukankan      html  css  js  c++  java
  • 洛谷P1443 马的遍历

    题目描述

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

    输入格式

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

    输出格式

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

    输入输出样例

    输入 #1
    3 3 1 1
    
    输出 #1
    0    3    2    
    3    -1   1    
    2    1    4    
    代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    using namespace std;
    struct wjz{
    int x,y,d;
    };
    int ans[410][410];
    bool vis[410][410];
    int dx[8]={1,2,-1,-2,1,2,-1,-2};
    int dy[8]={2,1,2,1,-2,-1,-2,-1};
    queue<wjz> Q;
    wjz w;
    int main()
    {
    memset(ans,-1,sizeof(ans));
    int m,n,a,b;
    cin>>n>>m>>a>>b;
    ans[a][b]=0;
    vis[a][b]=1;
    Q.push((wjz){a,b,0});
    while(!Q.empty())
    {
    w=Q.front();
    Q.pop();
    for(int i=0;i<=7;i++)
    {
    int ax=w.x+dx[i],ay=w.y+dy[i];
    if(ax>=1&&ax<=n&&ay>=1&&ay<=m&&vis[ax][ay]==0)
    {
    Q.push((wjz){ax,ay,w.d+1});
    ans[ax][ay]=w.d+1;
    vis[ax][ay]=1;
    }
    }
    }
    for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=m;j++)
    printf("%-5d",ans[i][j]);
    cout<<endl;
    }
    return 0;
    }

  • 相关阅读:
    codevs2034 01串2
    codevs2622数字序列( 连续子序列最大和O(n)算法)
    codevs3008加工生产调度(Johnson算法)
    codevs1955光纤通信(并查集)
    codevs4203山区建小学
    codevs2618核电站问题
    常用端口
    ntp时间同步服务器
    date linux系统校正时间
    用户切换
  • 原文地址:https://www.cnblogs.com/weijianzhen/p/12896255.html
Copyright © 2011-2022 走看看