洛谷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.  

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

原文地址:https://www.cnblogs.com/yzm10/p/4751989.html