• 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;
    }

  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/tcwbob/p/12891185.html
Copyright © 2020-2023  润新知