解题思路:讲一遍可以走的全部走完 理解后特别简单 

注意事项:

参考代码:

#include

using namespace std;

int dx[]={1,1,-1,-1,2,2,-2,-2};

int dy[]={2,-2,2,-2,1,-1,1,-1};//方向数组 

int a[305][305]={0}//标记

int step[305][305]={0};//步数 

int m,n,x2,y2;//起始点和终点 

int h;

void dfs(int m,int n)

{

queue

x.push(m),y.push(n);

step[m][n]=0;//刚开始步数为0 

a[m][n]=1;//标记 

while(!x.empty())//结束条件 

{

int tx=x.front(),ty=y.front();//找出点 

if(tx == x2 && ty == y2)

{

cout << step[tx][ty] << endl;//找到输出并结束

break;

}

x.pop(),y.pop();//跳出队列 

for(int i=0;i<8;i++)

{

int sx = tx +dx[i],sy = ty + dy[i];

if(a[sx][sy] == 0 && sx>=0 && sy>=0 && sx<=h && sy<=h)//看是否标记和出棋盘 

{

x.push(sx);

y.push(sy);//入队 

a[sx][sy]=1;//标记 

step[sx][sy]=step[tx][ty]+1;//上一步加1 

}

}

}

}

int main()

{

   int k;

   cin >> k;

   for(int i = 0 ;i< k ;i++)

   {

    cin >> h;

    cin >> m >> n >> x2 >> y2;

    if(m == x2 && n == y2)

    {

    printf("0\n"); 

    continue;

   }

    else dfs(m,n);

memset(step,0,sizeof(step));

memset(a,0,sizeof(a));//重置为0 

   }

return 0;

}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论