解题思路:讲一遍可以走的全部走完 理解后特别简单
注意事项:
参考代码:
#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分
1 人评分
C语言考试练习题_排列 (C语言代码)浏览:767 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:1432 |
简单的a+b (C语言代码)浏览:641 |
WU-蓝桥杯算法提高VIP-交换Easy (C++代码)浏览:1186 |
C语言考试练习题_保留字母 (C语言代码)浏览:743 |
1013题解浏览:596 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:1968 |
C二级辅导-进制转换 (C语言代码)浏览:750 |
链表数据求和操作 (C语言代码)浏览:1035 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:1260 |