问题标题: 酷町堂:3607 还是象棋

0
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();
}

为什么超时了

请给出修改的过程


0
已采纳
曾凡一
曾凡一
新手光能
新手光能

马的遍历广搜版是吗?

0
0
0
0
我要回答