登 录
一直听到大家在说双向BFS,自己从来没用,于是今天也找了个题目写着玩。
直接写的,没有参照别人代码。
候选结点,用了两个队列保存。至于已经到达的状态,一个数组足矣。从起点出发到达的用正数表示,从终点出发到达的用负数表示。
然后当整数碰到负数,说明找到了,结束。
#include <iostream> #include <algorithm> using namespace std; int n; int move[8][2]={2,1,2,-1,-2,1,-2,-1,1,2,1,-2,-1,2,-1,-2}; bool check(int x,int y) { if(x<0||x>=n||y<0||y>=n) return false; else return true; } struct node { int x,y; int step; }queue[160000],queue2[160000]; int visit[160000]; int first,first2,end,end2; int store(node& a,int from) { int pos=a.x*n+a.y; if(visit[pos]*from<0) { printf("%d/n",abs(visit[pos])+abs(a.step)-2); return 2;//另一端已经到达该点 } else if(visit[pos]==0) { visit[pos]=a.step*from; return 0;//该点未曾访问 } return 1;//自己曾经到达,没什么意思 } bool advance(node a[],int& first,int& end,int from) { int ans; for(int i=0;i<8;i++) { a[end].step=a[first].step+1; a[end].x=a[first].x+move[i][0]; a[end].y=a[first].y+move[i][1]; if(!check(a[end].x,a[end].y)) continue; ans=store(a[end],from); if(ans==2) return true; else if(ans==0) end++; } first++; return false; } int main() { int T,ans; scanf("%d",&T); for(int t=0;t<T;t++) { memset(visit,0,sizeof(visit)); scanf("%d",&n); first=first2=0; end=end2=1; scanf("%d%d",&queue[0].x,&queue[0].y); scanf("%d%d",&queue2[0].x,&queue2[0].y); queue[0].step=queue2[0].step=1; if(store(queue[0],1)==2) continue; if(store(queue2[0],-1)==2) continue; while(1) { if(advance(queue,first,end,1)) break; if(advance(queue2,first2,end2,-1)) break; } } return 0; }
抱歉!评论已关闭.