一道简单的广搜题:Knight Moves

这本来是要用双向宽度搜索的,但是我用简单的广搜也成功了,L<=300,也不会超时??

另外一个问题就是,我本来想用原来的代码交,结果80分??将边界条件从小于L改成小于等于L,就对了。我可能不会下棋。。。

#include<bits/stdc++.h>
using namespace std;
int dx[8]={1,1,2,2,-1,-1,-2,-2};
int dy[8]={2,-2,1,-1,2,-2,-1,1};
//int maxs=-1;
//bool bz[100][100];
int s[400][400];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int i1,i2,j1,j2;
        memset(s,0xff,sizeof(s));
        int q[100000][3];
        int L;
        cin>>L;
        cin>>i1>>j1;
        cin>>i2>>j2;
        if(i2==i1&&j2==j1)
        {
            cout<<0<<endl;
            continue;
        }
        int head=0,tail=1;
        q[1][1]=i1,q[1][2]=j1,q[1][3]=0;
        bool f=0;
        while(head<tail)
        {
            head++;
            for(int k=0;k<8;k++)
            {
                int x=q[head][1]+dx[k];
                int y=q[head][2]+dy[k];
                if(x>=0&&x<=L&&y>=0&&y<=L&&s[x][y]==-1)
                {
                    s[x][y]=q[head][3]+1;
                    tail++;
                    q[tail][1]=x;
                    q[tail][2]=y;
                    q[tail][3]=s[x][y];
                    if(s[i2][j2]>-1)
                    {
                        f=1;
                        cout<<s[i2][j2]<<endl;
                        break;
                    }
                }        
            }
            if(f) break;
        }
    }
    
}

 

posted @ 2018-08-22 21:08  南柯一场  阅读(364)  评论(0编辑  收藏  举报