标签:
Description
Input
Output
Sample Input
3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1
Sample Output
5 28 0
题意:给一个m,n。m指几组数据,n指在这组数据中map【n】【n】,然后给起点,和终点,问最少几步完成,日字形走路,就是象棋中的马
tip:广搜
1 #include<iostream> 2 #include<queue> 3 #include<cstring> 4 5 using namespace std; 6 7 int fx,fy,lx,ly,n,m; 8 int map[305][305],dis[305][305];///前者放答案,后者为标记数组 9 int x[]={1,-1,1,-1,2,-2,2,-2}; 10 int y[]={2,-2,-2,2,1,-1,-1,1};///八个方向 11 12 void bfs() 13 { 14 queue<int> q;///队列,放可以到达的点 15 q.push(fx); 16 q.push(fy); 17 18 memset(map,0,sizeof(map)); 19 memset(dis,0,sizeof(dis)); 20 dis[fx][fy]=1; 21 22 int vx,vy,tx,ty; 23 while(!q.empty()) 24 { 25 vx=q.front(); 26 q.pop(); 27 vy=q.front(); 28 q.pop(); 29 if(vx==lx&&vy==ly)///到达终点 30 break; 31 32 for(int i=0;i<8;i++) 33 { 34 tx=vx+x[i]; 35 ty=vy+y[i]; 36 if(!dis[tx][ty]&&tx<m&&tx>=0&ty<m&&ty>=0) 37 { 38 q.push(tx); 39 q.push(ty); 40 dis[tx][ty]=1;///标记,,,有 41 map[tx][ty]=map[vx][vy]+1;///相当于递归作用 42 } 43 } 44 45 } 46 } 47 48 int main() 49 { 50 cin>>n; 51 while(n--) 52 { 53 cin>>m; 54 cin>>fx>>fy>>lx>>ly; 55 bfs(); 56 cout<<map[lx][ly]<<endl; 57 } 58 return 0; 59 }
标签:
原文地址:http://www.cnblogs.com/moqitianliang/p/4773135.html