POJ 1915 Knight Moves G++

xiaoxiao2021-02-28  87

#include <iostream> #include <utility> #include <queue> #include <cstring> //参考《挑战》中的宽搜 using namespace std; int dx[8]={1,2,2,1,-1,-2,-2,-1}; int dy[8]={-2,-1,1,2,2,1,-1,-2}; int main() { int N; cin>>N; int jg[N]; for(int i=0;i<N;i++) { int NUM; cin>>NUM; int a[NUM][NUM]; memset(a,0,sizeof(a)); int sx,sy; int ex,ey; cin>>sx>>sy; cin>>ex>>ey; queue<pair<int,int> > que; que.push(pair<int,int>(sx,sy)); a[sx][sy]=1; jg[i]=0; while(que.size()) { pair<int,int> t=que.front(); que.pop(); if((t.first==ex)&&(t.second==ey)) { jg[i]=a[t.first][t.second]; break; } for(int i=0;i<8;i++) { int nx=t.first+dx[i]; int ny=t.second+dy[i]; if((nx>=0)&&(nx<NUM)&&(ny>=0)&&(ny<NUM)&&(a[nx][ny]==0)) { que.push(pair<int,int>(nx,ny)); a[nx][ny]=a[t.first][t.second]+1; } } } } for(int i=0;i<N;i++) { cout<<jg[i]-1<<endl; } return 0; }

l*l的国际象棋棋盘,给出马的起始坐标和终止坐标,求从起始到终止最少多少步。

转载请注明原文地址: https://www.6miu.com/read-35381.html

最新回复(0)