题目链接:https://vjudge.net/problem/POJ-1915
题意:求棋盘上起点到终点最少的步数。
思路:双向广搜模板题,但玄学的是我的代码G++会wa,C++过了,没找到原因QAQ。。
AC代码:
#include<cstdio> #include<algorithm> #include<queue> using namespace std; const int maxn=305; int go[8][2]={-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1}; int T,n,sx,sy,ex,ey,vis1[maxn][maxn],vis2[maxn][maxn]; struct node{ int x,y,s; node():x(0),y(0),s(0){} node(int x,int y,int s):x(x),y(y),s(s){} }; int bfs(){ vis1[sx][sy]=vis2[ex][ey]=0; queue<node> que1,que2; que1.push(node(sx,sy,0)); que2.push(node(ex,ey,0)); while(!que1.empty()||!que2.empty()){ if(!que1.empty()){ node now=que1.front();que1.pop(); int nx=now.x,ny=now.y,ns=now.s; if(vis2[nx][ny]>=0){ return ns+vis2[nx][ny]; } for(int i=0;i<8;++i){ int xx=nx+go[i][0],yy=ny+go[i][1]; if(xx<1||xx>n||yy<1||yy>n||vis1[xx][yy]>=0) continue; vis1[xx][yy]=ns+1; que1.push(node(xx,yy,ns+1)); } } if(!que2.empty()){ node now=que2.front();que2.pop(); int nx=now.x,ny=now.y,ns=now.s; if(vis1[nx][ny]>=0){ return ns+vis1[nx][ny]; } for(int i=0;i<8;++i){ int xx=nx+go[i][0],yy=ny+go[i][1]; if(xx<1||xx>n||yy<1||yy>n||vis2[xx][yy]>=0) continue; vis2[xx][yy]=ns+1; que2.push(node(xx,yy,ns+1)); } } } } int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) vis1[i][j]=vis2[i][j]=-1; scanf("%d%d%d%d",&sx,&sy,&ex,&ey); ++sx,++sy,++ex,++ey; if(sx==ex&&sy==ey) printf("0 "); else printf("%d ",bfs()); } return 0; }