zoukankan      html  css  js  c++  java
  • 洛谷1443 马的遍历 解题报告

    洛谷1443 马的遍历

    本题地址: http://www.luogu.org/problem/show?pid=1443

    题目描述

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

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1:

    3 3 1 1
    

    输出样例#1:

    0    3    2    
    3    -1   1    
    2    1    4    

    题解

    广搜BFS

    这道题目选择广搜思路会更清晰一些。

    我们都知道马的走法(马走日)。

    首先,将所有点赋值为-1,如果马没有经过某个点,那么它的值还是保持-1不变。

    从起点开始,把当前点移除队列,再从当前点向外扩展一层,将新节点加入队列。同时,用计数器记录步数,赋值给新节点。

    当走到终点后,将所有点的值输出即可。

    下面附上代码。

    代码

    1. const      
    2.   dx:array[1..8] of longint=(2,2,-2,-2,1,1,-1,-1);      
    3.   dy:array[1..8] of longint=(1,-1,-1,1,2,-2,2,-2);      
    4. var       
    5.   k,n,m,x,y,i,j,xx,yy,head,tail:longint;      
    6.   q:array[1..2000000,1..2] of longint;      
    7.   a:array[-2..200,-2..200] of longint;      
    8.   dist:array[-10..210,-10..210] of int64;      
    9. begin      
    10.   read(n,m,x,y);      
    11.   fillchar(dist,sizeof(dist),-1);      
    12.     q[1,1]:=x; q[1,2]:=y; head:=0; tail:=1; dist[x,y]:=0;      
    13.   while head<tail do      
    14.     begin      
    15.       inc(head);       
    16.       x:=q[head,1]; y:=q[head,2];      
    17.       for i:=to do      
    18.         begin      
    19.           xx:=x+dx[i]; yy:=y+dy[i];      
    20.           if (dist[xx,yy]=-1) and (xx>0) and (xx<=n) and (yy>0) and(yy<=m) then      
    21.             begin      
    22.               inc(tail);      
    23.               q[tail,1]:=xx; q[tail,2]:=yy;      
    24.               dist[xx,yy]:=dist[x,y]+1;      
    25.             end;      
    26.         end;      
    27.     end;      
    28.   for i:=to n do      
    29.     begin      
    30.     for j:=to m do      
    31.       begin      
    32.         write(dist[i,j]);      
    33.         if dist[i,j]=-then for k:=to do write(' ')     
    34.         else if dist[i,j] div 10=then for k:=to do write(' ')     
    35.         else if dist[i,j] div 100=then for k:=to do write (' ')      
    36.         else if dist[i,j] div 1000=then for k:=to do write(' ')      
    37.         else if dist[i,j] div 10000=then write(' ');      
    38.       end;      
    39.       writeln;      
    40.     end;      
    41. end.  

    (本文系笔者原创,未经允许不得转载)

  • 相关阅读:
    spring scope prototype与singleton区别
    JAVA中的内存们
    汉诺塔问题
    关于设置tomcat端口为80的事
    struts2表单提单细节处理
    volatile的作用
    Java并发编程:Thread类的使用
    git的几个小技巧
    UEdit插件使用
    MySQL优化必须调整的10项配置
  • 原文地址:https://www.cnblogs.com/yzm10/p/4751989.html
Copyright © 2011-2022 走看看