0
已解决
张睿杰
初级天翼
初级天翼
3607 还是象棋
题目描述 Description
现在象棋的棋盘上有两个马,马1和马2分别在点(x1,y1)和(x2,y2)上,现在规定马不仅可以走“日”,还可以走“田”,现在需要你求出两个马都到点(1,1)的最少步数。
输入描述 Input Description
第1行:两个整数x1,y1
第2行:两个整数x2,y2
输出描述 Output Description
第1行:马1到(1,1)的最少步数
第2行:马2到(1,1)的最少步数
样例输入 Sample Input
12 16 18 10
样例输出 Sample Output
8 9
数据范围及提示 Data Size & Hint
100%数据:x1,y1,x2,y2≤20
#include <iostream>
#include <queue>
using namespace std;
struct node{
int x1,y1,x2,y2,step1,step2;
};
node st;
queue<node> q;
int m[9][2]={{0},{-2,-1},{-1,-2},{1,-2},{2,-1},{-1,2},{-2,1},{1,2},{2,1}};
int x[5][2]={{0},{-2,-2},{2,-2},{-2,2},{2,2}};
int vis1[21][21],vis2[21][21];
int check1(int x,int y)
{
return x>=1&&x<=20&&y>=1&&y<=20&&!vis1[x][y];
}
int check2(int x,int y)
{
return x>=1&&x<=20&&y>=1&&y<=20&&!vis2[x][y];
}
int BFS()
{
int h1=0,h2=0;
vis1[st.x1][st.y1]=1;
vis2[st.x2][st.y2]=1;
while(!q.empty())
{
node head=q.front();
q.pop();
if(head.x1==1&&head.y1==1)
{
cout<<head.step1<<endl;
h1=1;
if(h1==1&&h2==1) return 0;
}
if(head.x2==1&&head.y2==1)
{
cout<<head.step2<<endl;
h2=1;
if(h1==1&&h2==1) return 0;
}
for(int i=1;i<=8;i++)
{
node temp;
bool f1=0,f2=0;
temp.x1=head.x1+m[i][0];
temp.y1=head.y1+m[i][1];
temp.x2=head.x2+m[i][0];
temp.y2=head.y2+m[i][1];
if(h1==0&&check1(temp.x1,temp.y1))
{
f1=1;
vis1[temp.x1][temp.y1]=1;
temp.step1=head.step1+1;
}
if(h2==0&&check2(temp.x2,temp.y2))
{
f2=1;
vis2[temp.x2][temp.y2]=1;
temp.step2=head.step2+1;
}
if(f1==1&&f2==0)
{
temp.x2=head.x2;
temp.y2=head.y2;
q.push(temp);
}
else if(f1==0&&f2==1)
{
temp.x1=head.x1;
temp.y1=head.y1;
q.push(temp);
}
else q.push(temp);
}
for(int i=1;i<=4;i++)
{
node temp;
bool f1=0,f2=0;
temp.x1=head.x1+x[i][0];
temp.y1=head.y1+x[i][1];
temp.x2=head.x2+x[i][0];
temp.y2=head.y2+x[i][1];
if(h1==0&&check1(temp.x1,temp.y1))
{
f1=1;
vis1[temp.x1][temp.y1]=1;
temp.step1=head.step1+1;
}
if(h2==0&&check2(temp.x2,temp.y2))
{
f2=1;
vis2[temp.x2][temp.y2]=1;
temp.step2=head.step2+1;
}
if(f1==1&&f2==0)
{
temp.x2=head.x2;
temp.y2=head.y2;
q.push(temp);
}
else if(f1==0&&f2==1)
{
temp.x1=head.x1;
temp.y1=head.y1;
q.push(temp);
}
else q.push(temp);
}
cout<<head.x1<<" "<<head.y1<<" "<<head.step1<<endl;
cout<<head.x2<<" "<<head.y2<<" "<<head.step2<<endl;
cout<<endl;
}
}
int main()
{
int z1,c1,z2,c2;
cin>>z1>>c1>>z2>>c2;
st.x1=z1;
st.y1=c1;
st.x2=z2;
st.y2=c2;
st.step1=0;
st.step2=0;
q.push(st);
BFS();
}
为什么超时了
请给出修改的过程