Sicily1781. Knight

来源:互联网 发布:mac安装文件删不掉 编辑:程序博客网 时间:2024/05/17 08:39

宽度优先搜索

// Problem#: 1781
// Submission#: 1213022
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
/*典型的宽度优先搜索题,可以先把所有点的距离值初始化为 -1 ,若马跳到某点,那么距离值将会
  改变,若某点无法到达,那么距离值则无法更新,直接输出该点距离值即可(即 -1 )。*/
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

queue<int> q;
int vis[510][510];
int dis[510][510];
int dx[] = {-2, -2, -1, 1, 2, 2, 1, -1};
int dy[] = {-1, 1, 2, 2, 1, -1, -2, -2};

int main()
{
   int t;
   cin>>t;
   while(t--)
   {
       memset(vis,0,sizeof(vis));
       memset(dis,-1,sizeof(dis));
       while(!q.empty())
           q.pop();
       int n,x1,x2,y1,y2;
       cin>>n;
       cin>>x1>>y1>>x2>>y2;
       vis[x1][y1]=1;
       dis[x1][y1]=0;
       int sum1=x1*n+y1,sum2=x2*n+y2;
       if(sum1==sum2)
           cout<<0<<endl;
       else
       {
           q.push(sum1);
           while(!q.empty())
           {
               int l=q.front(),x,y;
               if(l==sum2)
                   break;
               q.pop();
               x=l/n;
               y=l%n;
               for(int i=0;i<8;i++)
               {
                   int num1=x+dx[i],num2=y+dy[i];
                   if(num1>=0&&num1<n&&num2>=0&&num2<n)
                   {
                       if(!vis[num1][num2])
                       {
                           vis[num1][num2]=1;
                           dis[num1][num2]=dis[x][y]+1;
                           q.push(num1*n+num2);
                       }
                   }
               }
           }
           cout<<dis[x2][y2]<<endl;
       }
   }
    return 0;
}                                

原创粉丝点击