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

  • 相关阅读:
    css居中问题(转)
    Request.ServerVariables 各个参数的用法
    html5 画个球碰撞
    递归生成json
    AspNetPager分页结合存储过程的用法
    sql+aspnetpager+查询功能
    求1+2+……+n
    几种排序的比较 bitmapsort,qsort,set
    利用两个栈,反转其中一个栈的元素
    进程间通信(IPC, Inter Process Communication)读书笔记
  • 原文地址:https://www.cnblogs.com/tcwbob/p/12891185.html
Copyright © 2011-2022 走看看