ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

专题一搜索 B - Knight Moves

2022-01-23 21:31:07  阅读:170  来源: 互联网

标签:专题 vis Knight nx ny step && push Moves


  1. 题目描述

    原题来自:POJ 1915

    编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。

    Picture 1

    输入格式

    第一行给出骑士的数量 nn。
    在接下来的 3n3n 行中,每 33 行描述了一个骑士。其中,

    • 第一行一个整数 LL 表示棋盘的大小,整个棋盘大小为 L\times LL×L;
    • 第二行和第三行分别包含一对整数 (x,y)(x,y),表示骑士的起始点和终点。假设对于每一个骑士,起始点和终点均合理。
    输出格式

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

    样例
    InputOutput
    3
    8
    0 0
    7 0
    100
    0 0
    30 50
    10
    1 1
    1 1
    5
    28
    0
    数据范围与提示

    对于 100\%100% 的数据,有 4\le L\le 3004≤L≤300,保证 0\le x,y\le L-10≤x,y≤L−1。

  2. 思路
    广搜样板题,不细说了
  3. 代码
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    using namespace std;
    
    int t,n,sx,sy,ex,ey,nx,ny;
    int vis[333][333];
    int step[333][333];
    int main()
    {
    	scanf("%d",&t);
    	for(int i=0;i<t;i++)
    	{
    		scanf("%d%d%d%d%d",&n,&sx,&sy,&ex,&ey);
    		queue<int>qx,qy;
    		qx.push(sx),qy.push(sy);
    		vis[sx][sy]=1;
    		step[sx][sy]=0;
    		while(!qx.empty()&&!qy.empty())
    		{
    			nx=qx.front(),qx.pop();
    			ny=qy.front(),qy.pop();
    			if(nx==ex&&ny==ey)
    			{
    				break;
    			}
    			if(nx-2>=0&&ny+1<=n&&vis[nx-2][ny+1]==0)
    			{
    				qx.push(nx-2);
    				qy.push(ny+1);
    				step[nx-2][ny+1]=step[nx][ny]+1;
    				vis[nx-2][ny+1]=1;
    			}
    			if(nx-2>=0&&ny-1>=0&&vis[nx-2][ny-1]==0)
    			{
    				qx.push(nx-2);
    				qy.push(ny-1);
    				step[nx-2][ny-1]=step[nx][ny]+1;
    				vis[nx-2][ny-1]=1;
    			}
    			if(nx-1>=0&&ny+2<=n&&vis[nx-1][ny+2]==0)
    			{
    				qx.push(nx-1);
    				qy.push(ny+2);
    				step[nx-1][ny+2]=step[nx][ny]+1;
    				vis[nx-1][ny+2]=1;
    			}
    			if(nx-1>=0&&ny-2>=0&&vis[nx-1][ny-2]==0)
    			{
    				qx.push(nx-1);
    				qy.push(ny-2);
    				step[nx-1][ny-2]=step[nx][ny]+1;
    				vis[nx-1][ny-2]=1;
    			}
    			if(nx+1<=n&&ny+2<=n&&vis[nx+1][ny+2]==0)
    			{
    				qx.push(nx+1);
    				qy.push(ny+2);
    				step[nx+1][ny+2]=step[nx][ny]+1;
    				vis[nx+1][ny+2]=1;
    			}
    			if(nx+2<=n&&ny+1<=n&&vis[nx+2][ny+1]==0)
    			{
    				qx.push(nx+2);
    				qy.push(ny+1);
    				step[nx+2][ny+1]=step[nx][ny]+1;
    				vis[nx+2][ny+1]=1;
    			}
    			if(nx+2<=n&&ny-1>=0&&vis[nx+2][ny-1]==0)
    			{
    				qx.push(nx+2);
    				qy.push(ny-1);
    				step[nx+2][ny-1]=step[nx][ny]+1;
    				vis[nx+2][ny-1]=1;
    			}
    			if(nx+1<=n&&ny-2>=0&&vis[nx+1][ny-2]==0)
    			{
    				qx.push(nx+1);
    				qy.push(ny-2);
    				step[nx+1][ny-2]=step[nx][ny]+1;
    				vis[nx+1][ny-2]=1;
    			}
    		}
    		memset(vis,0,sizeof(vis));
    		printf("%d\n",step[ex][ey]);
    	}
    	return 0;
    }
    

      

标签:专题,vis,Knight,nx,ny,step,&&,push,Moves
来源: https://www.cnblogs.com/Benincasa/p/15837457.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有