• #1074 骑士问题 的题解


    题目描述

    小明是一名出色的棋手,声称没有人能像他那样快速地把骑士从一个位置移到另一个位置,你能打败他吗?
    编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。

    输入

    第一行给出骑士的数量 n。对于每一个骑士都有3行,第一行一个整数 L 表示棋盘的大小(4≤L≤300),整个棋盘大小为 L×L;
    第二行和第三行分别包含一对整数 (x,y),表示骑士的起始点和终点。假设对于每一个骑士,起始点和终点均合理。

    输出

    对每一个骑士输出一行,一个整数表示需要移动的最小步数。如果起始点和终点相同,则输出 0。
    • 样例输入

    View Code
    • 样例输出

    View Code

    题解

    • 分析

    这道题是一道广搜题,用深搜可能会时间超限。这道题难度也不低,代码很长,需要用到队列queue

    代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 bool vis[301][301];
     4 int step[301][301],ans,t,n,sx,sy,ex,ey,nx,ny;
     5 int main()
     6 {
     7     scanf("%d",&t);
     8     while(t--)
     9     {
    10         scanf("%d%d%d%d%d",&n,&sx,&sy,&ex,&ey);
    11         queue<int> qx,qy;
    12         qx.push(sx),qy.push(sy);
    13         vis[sx][sy]=1;
    14         step[sx][sy]=0;
    15         while(!qx.empty()&&!qy.empty())
    16         {
    17             nx=qx.front(),qx.pop();
    18             ny=qy.front(),qy.pop();
    19             if(nx==ex&&ny==ey)
    20             {
    21                 ans=step[ex][ey];
    22                 break;
    23             }
    24             if(nx-2>=0&&ny+1<=n&&vis[nx-2][ny+1]==0)//八个方向开始搜索 
    25             {
    26                 qx.push(nx-2);
    27                 qy.push(ny+1);
    28                 step[nx-2][ny+1]=step[nx][ny]+1;
    29                 vis[nx-2][ny+1]=1;
    30             }
    31             if(nx-2>=0&&ny-1>=0&&vis[nx-2][ny-1]==0)
    32             {
    33                 qx.push(nx-2);
    34                 qy.push(ny-1);
    35                 step[nx-2][ny-1]=step[nx][ny]+1;
    36                 vis[nx-2][ny-1]=1;
    37             }
    38             if(nx-1>=0&&ny+2<=n&&vis[nx-1][ny+2]==0)
    39             {
    40                 qx.push(nx-1);
    41                 qy.push(ny+2);
    42                 step[nx-1][ny+2]=step[nx][ny]+1;
    43                 vis[nx-1][ny+2]=1;
    44             }
    45             if(nx-1>=0&&ny-2>=0&&vis[nx-1][ny-2]==0)
    46             {
    47                 qx.push(nx-1);
    48                 qy.push(ny-2);
    49                 step[nx-1][ny-2]=step[nx][ny]+1;
    50                 vis[nx-1][ny-2]=1;
    51             }
    52             if(nx+1<=n&&ny+2<=n&&vis[nx+1][ny+2]==0)
    53             {
    54                 qx.push(nx+1);
    55                 qy.push(ny+2);
    56                 step[nx+1][ny+2]=step[nx][ny]+1;
    57                 vis[nx+1][ny+2]=1;
    58             }
    59             if(nx+2<=n&&ny+1<=n&&vis[nx+2][ny+1]==0)
    60             {
    61                 qx.push(nx+2);
    62                 qy.push(ny+1);
    63                 step[nx+2][ny+1]=step[nx][ny]+1;
    64                 vis[nx+2][ny+1]=1;
    65             }
    66             if(nx+2<=n&&ny-1>=0&&vis[nx+2][ny-1]==0)
    67             {
    68                 qx.push(nx+2);
    69                 qy.push(ny-1);
    70                 step[nx+2][ny-1]=step[nx][ny]+1;
    71                 vis[nx+2][ny-1]=1;
    72             }
    73             if(nx+1<=n&&ny-2>=0&&vis[nx+1][ny-2]==0)
    74             {
    75                 qx.push(nx+1);
    76                 qy.push(ny-2);
    77                 step[nx+1][ny-2]=step[nx][ny]+1;
    78                 vis[nx+1][ny-2]=1;
    79             }
    80         }
    81         printf("%d
    ",ans);
    82         memset(vis,0,sizeof(vis));
    83         memset(step,0,sizeof(step));
    84         nx=0,ny=0,ans=0;
    85         while(!qx.empty()&&!qy.empty())
    86         {
    87             qx.pop();
    88             qy.pop();
    89         }
    90     }
    91     return 0;
    92 }
    View Code
  • 相关阅读:
    maven
    面试宝典之Java程序运行原理
    并发队列总结
    HashMap探究
    Linux安装python应用之前需要安装的库
    Linux中为Python应用安装uwsgi
    常用SQL语句
    Windows CE无法连接Win 10
    无法加载 DLL xpstar.dll 或它引用的一个 DLL。原因: 126(找不到指定的模块。)。
    SQL Server 数据恢复
  • 原文地址:https://www.cnblogs.com/ssf-lrk/p/11249569.html
Copyright © 2020-2023  润新知