关于跳马

#include<iostream>

#include<queue>

#include<map>

//对于这个程序,我想说,一定一定注意清空棋盘,这是何等的卧槽2333

using namespace std;

queue<int>q1;

map<int,int>step;

int a,b,c,d,A,B,C,D;

void init();

int num[40000]={0};

int dr[8]={-2,-1,1,2,2,1,-1,-2};

int dc[8]={1,2,2,1,-1,-2,-2,-1};

int can(int u,int dire);

int move(int u,int dire);

int bfs(); 

int main()

{

int ans[101],n,i;

cin>>n;

for(i=1;i<=n;i++)

{

cin>>A>>B>>C>>D;

a=A-1;

b=B-1;

c=C-1;

d=D-1;

init();

ans[i]=bfs();

}

for(i=1;i<=n;i++)

cout<<ans[i]<<endl;

}

int bfs()

{

int u,v,i,m,n;

while(!q1.empty())

{

u=q1.front();

q1.pop();

for(i=0;i<8;i++)

{

if(can(u,i))

{

v=move(u,i);

if(v==c*200+d)

{

while(!q1.empty())

                    {    

                      m=q1.front();  

                   
q1.pop();

                    }

                    for(i=0;i<199*199;i++)

                    {

                   
num[i]=0;

                    }

                 

return(step[u]+1);

   }

if(num[v]==0)

{

q1.push(v);

step[v]=step[u]+1;

num[v]++;

}

}

}

}

}

int can(int u,int dire)

{

int r,c,mr,mc;;

r=u/200;

c=u%200;

mr=r+dr[dire];

mc=c+dc[dire];

if(mr>=0&&mr<200&&mc>=0&&mc<200)

return 1;

else

return 0;

}

int move(int u,int dire)

{

int r,c,mr,mc,en;

r=u/200;

c=u%200;

mr=r+dr[dire];

mc=c+dc[dire];

en=mr*200+mc;

return(en);

}

void init()

{

int u;

u=a*200+b;

q1.push(u);

step[u]=0;

num[u]++;

}

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/zhangyige123321/article/details/78525702
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞