解题思路:讲一遍可以走的全部走完 理解后特别简单
注意事项:
参考代码:
#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语言代码)......浏览:645 |
2006年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:468 |
C语言程序设计教程(第三版)课后习题6.11 (C语言代码)浏览:549 |
C语言程序设计教程(第三版)课后习题9.3 (C语言代码)浏览:2090 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:1456 |
简单的a+b (C语言代码)浏览:414 |
C二级辅导-温度转换 (C语言代码)浏览:718 |
妹子杀手的故事 (C语言代码)浏览:1046 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:602 |
C二级辅导-公约公倍 (C语言代码)浏览:1310 |