zoukankan      html  css  js  c++  java
  • 骑士

    题目

    骑士
    难度级别:C; 运行时间限制:1000ms; 运行空间限制:128000KB; 代码长度限制:2000000B
    试题描述

    骑士的行走方式类似于象棋中的马,现在给你一个任务,计算骑士从一点到另一点所需的最少步数。

    输入
    第一行给出骑士的数量n。对于每一个骑士都有3行,第一行一个整数L,表示棋盘的大小(4<=L<=300),整个棋盘大小为LxL(坐标范围为0...L);第二行和第三行分别包含一对整数(xy),表示骑士的起始点和终点。假设,对于每一个骑士起始点和终点均合理。
    输出
    对每一个骑士输出一行,一个整数表示需要移动的最少步数。如果起始点和终点相同,则输出0。
    输入示例
    3
    8
    0 0
    7 0
    100
    0 0
    30 50
    10
    1 1
    1 1
    输出示例
    5
    28
    0

    分析

        前面一直在发简单题,终于,在同学的劝说下,发一道符合自己当前水平的题。

        前方高能,新手慎入!!!

        先来分析一下,这道无比坑人的题。

        坑人点:

            1.每组样例含多组数据,每算完一组数据,就要把变量都清零。

            2.每次搜八个方向,容易搞乱。

            3.用到队列。

        刚刚有说用到队列,那咱们先来科普一下有关队列的一些用法:

    q.front()//当前队列无队首。
    q.push()//元素入队。
    q.pop()//元素出队。
    q.empty()//当前为空队。
    queue<int>//队列定义队列元素,只有这样定义的变量才能进行以上操作。
    

        队列的基本用法了解了,下面来写题。

        代码很长,小心很多错误。这题我写就写了一天,上午写BUG,下午DEBUG……

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int step[305][305],ans[305],n,px,py,qx,qy,sx,sy,ex,ey,l;
    bool flag[305][305];
    int main()
    {
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    		queue<int> qx,qy;
    		scanf("%d%d%d%d%d",&l,&sx,&sy,&ex,&ey);
    		qx.push(sx);
    		qy.push(sy);
    		flag[sx][sy]=1;
    		step[sx][sy]=0;
    		while(!qx.empty()&&!qy.empty())
    		{
    			px=qx.front();
    			qx.pop();
    			py=qy.front();
    			qy.pop();
    			if(px==ex&&py==ey)
    			{
    				ans[i]=step[px][py];
    				break;
    			}
    			if(px-2>=0&&py+1<=l&&flag[px-2][py+1]==0)
    			{
    				qx.push(px-2);
    				qy.push(py+1);
    				step[px-2][py+1]=step[px][py]+1;
    				flag[px-2][py+1]=1;
    			}
    			if(px-1>=0&&py+2<=l&&flag[px-1][py+2]==0)
    			{
    				qx.push(px-1);
    				qy.push(py+2);
    				step[px-1][py+2]=step[px][py]+1;
    				flag[px-1][py+2]=1;
    			}
    			if(px+1<=l&&py+2<=l&&flag[px+1][py+2]==0)
    			{
    				qx.push(px+1);
    				qy.push(py+2);
    				step[px+1][py+2]=step[px][py]+1;
    				flag[px+1][py+2]=1;
    			}
    			if(px+2<=l&&py+1<=l&&flag[px+2][py+1]==0)
    			{
    				qx.push(px+2);
    				qy.push(py+1);
    				step[px+2][py+1]=step[px][py]+1;
    				flag[px+2][py+1]=1;
    			}
    			if(px-2>=0&&py-1>=0&&flag[px-2][py-1]==0)
    			{
    				qx.push(px-2);
    				qy.push(py-1);
    				step[px-2][py-1]=step[px][py]+1;
    				flag[px-2][py-1]=1;
    			}
    			if(px-1>=0&&py-2>=0&&flag[px-1][py-2]==0)
    			{
    				qx.push(px-1);
    				qy.push(py-2);
    				step[px-1][py-2]=step[px][py]+1;
    				flag[px-1][py-2]=1;
    			}
    			if(px+1<=l&&py-2>=0&&flag[px+1][py-2]==0)
    			{
    				qx.push(px+1);
    				qy.push(py-2);
    				step[px+1][py-2]=step[px][py]+1;
    				flag[px+1][py-2]=1;
    			}
    			if(px+2<=l&&py-1>=0&&flag[px+2][py-1]==0)
    			{
    				qx.push(px+2);
    				qy.push(py-1);
    				step[px+2][py-1]=step[px][py]+1;
    				flag[px+2][py-1]=1;
    			}
    		}
    		memset(flag,0,sizeof(flag));
    		while(!qx.empty()&&!qy.empty())
    		{
    			qx.pop();
    			qy.pop();
    		}
    	}
    	for(int i=0;i<n;i++) printf("%d
    ",ans[i]);
    	return 0;
    }
    作者:18西斯光剑
    出处:https://www.cnblogs.com/DARTH-VADER-EMPIRE/
    Copyright ©2018-2020 18西斯光剑
    All Rights Reserved.
  • 相关阅读:
    域名系统
    DNS域名解析过程
    服务器常用的状态码
    重绘与重排及它的性能优化
    console.time和console.timeEnd用法
    用CSS开启硬件加速来提高网站性能
    公钥和私钥
    svn conflict 冲突解决
    svn分支开发与主干合并(branch & merge)
    源生js惯性滚动与回弹效果
  • 原文地址:https://www.cnblogs.com/DARTH-VADER-EMPIRE/p/9499856.html
Copyright © 2011-2022 走看看