输入
共两行。
-
第二行为:B点的坐标x1,y1,两个数之间用空格隔开。
输出
第一行:A点到(1,1)的最少步数
样例输入
12 16
18 10
样例输出
8
9
我无须多言,各位大佬自能看懂本蒟蒻的代码qwq
解法1:
#include<bits/stdc++.h>
using namespace std;
int di[13]={0,-2,-2,-1,-1,1,1,2,2,-2,-2,2,2}, //一共12个方向
dj[13]={0,1,-1,2,-2,2,-2,1,-1,2,-2,2,-2};
int c[105][105];
bool f[105][105]; //标记是否走过
int bfs(int x, int y
{
queue<int>qx, qy;
qx.push(x,qy.push(y;
memset(c,0,sizeof(c;
memset(f,0,sizeof(f; //清零?为什么
f[x][y]=1,c[x][y]=0; //标记该点走过,第一个点为0步
if(x==1&&y==1 return 0;
while(!qx.empty(
{
for(int i=1;i<=12;i++
{
int a=qx.front(+di[i], b=qy.front(+dj[i];
if(a>=1&&b>=1&&a<=100&&b<=100&&f[a][b]==0 //未越界,未走过
{
if(a==1&&b==1 return c[qx.front(][qy.front(]+1; //如果到了终点
qx.push(a,qy.push(b; //如果没有到终点,就开始搜索,入队列
f[a][b]=1; //标记走过了
c[a][b]=c[qx.front(][qy.front(]+1; //步数加1
}
}
qx.pop(,qy.pop(;
}
}
int main(
{
int n1, n2, m1, m2;
cin>>n1>>m1>>n2>>m2;
cout<<bfs(n1, m1<<endl;
cout<<bfs(n2, m2;
}
解法2:
#include<bits/stdc++.h>
using namespace std;
bool f[105][105];
int c[105][105];
int dx[13]={0,-2,-2,2,2,-2,-2,-1,1,2,2,-1,1},
dy[13]={0,2,-2,-2,2,1,-1,2,2,1,-1,-2,-2};
int bfs(int h,int l
{
queue<int> qx,qy;
memset(c,0,sizeof(c;
memset(f,0,sizeof(f;
c[h][l]=0;f[h][l]=1;
qx.push(h;qy.push(l;
while(qx.empty(!=1
{
for(int i=1;i<=12;i++
{
int sx=qx.front(+dx[i],sy=qy.front(+dy[i];
if(sx<=100&&sx>=1&&sy<=100&&sy>=1&&f[sx][sy]==0
{
c[sx][sy]=c[qx.front(][qy.front(]+1;
qx.push(sx;qy.push(sy;
f[sx][sy]=1;
}
if(qx.back(==1&&qy.back(==1{return c[1][1];}
}
qx.pop(;qy.pop(;
}
}
int main(
{
int a,b,c,d;
cin>>a>>b>>c>>d;
cout<<bfs(a,b<<endl<<bfs(c,d;
}