• 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    
    本次带来一道广搜题,P1443 马的遍历。解这道题要用到BFS队列和二维数组的方法。将点以此读入进队列,达到最优步数的解。
    记得注意结构体数组的大小,会出现运行错误(RE)。

    #include<iostream>
    using namespace std;
    struct h
    {
    int x,y;
    }a[160000];
    int f=0,r=1,d[401][401],n,m,x1,y1;
    int b[16]={2,-2,2,-2,-1,1,-1,1},c[16]={1,1,-1,-1,2,2,-2,-2};//控制方向的数组
    int main()
    {
    cin>>n>>m>>x1>>y1;
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=m;j++)
    {
    d[i][j]=-1;
    }
    }
    d[x1][y1]=0;//初始点入队
    a[1].x=x1;
    a[1].y=y1;
    while(f<r)
    {
    f++;
    int s=d[a[f].x][a[f].y]+1;//新点入队前的最优步数
    for(i=0;i<8;i++)
    {
    int x2=a[f].x+b[i],y2=a[f].y+c[i];
    if(x2>=1&&x2<=n&&y2>=1&&y2<=m&&d[x2][y2]==-1)//判断棋盘边界及此点是否被遍历
    {
    r++;
    a[r].x=x2;//新点入队

    a[r].y=y2;//新点入队
    d[x2][y2]=s;//标记步数
    }
    }
    }
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=m;j++)
    {
    printf("%-5d",d[i][j]);
    }
    cout<<endl;
    }
    return 0;
    }

  • 相关阅读:
    获取字符串最长不重复子串
    斐波那契数列&&上台阶
    mysql 索引
    Python unittest框架实现appium登录
    解决RedisDesktopManager连接不上redis问题
    Nginx配置---启用gzip压缩
    Nginx配置---同一端口下部署不同项目
    Nginx配置---解决History路由报错问题
    个人网站搭建基本流程
    Create-React-App项目中CSS Modules的使用
  • 原文地址:https://www.cnblogs.com/tcwbob/p/12891185.html
Copyright © 2020-2023  润新知