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    
    本次带来一道广搜题,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;
    }

  • 相关阅读:
    .NET Core 初次上手Swagger
    SQL server字符串分割成表-表分割为字符串
    C# DataTable、DataSet、List、相互转换
    .NET core Quartz 定时任务框架 demo
    SQL 乐色干货笔记
    .NET-异步操作
    .NET Core随笔把数据库数据查出来转JSON并输出
    ASP.NET Nlog上手练习小例子
    C# 数据类型
    获取Excel
  • 原文地址:https://www.cnblogs.com/tcwbob/p/12891185.html
Copyright © 2011-2022 走看看