以前做过,所以现在觉得很简单,需要剪枝,注意广搜的特性;
另外题目中,当人在牛的前方时,人只能后退。
#define _CRT_SECURE_NO_WARNINGS //这是非一般的最短路,所以广搜到的最短的路不一定是所要的路线 //所以应该把所有的路径都搜索出来,找到最短的转折数,看他是不是不大于2 //我是 用边搜索边更新当前路径的最小转弯数 来写的 #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; #define MAXN 100010 bool vis[MAXN]; int s,t; struct tt { int x,step; }; int bfs() { tt front,rear,temp; queue<tt>q; while(!q.empty()) q.pop(); memset(vis,false,sizeof(vis)); front.x=s;front.step=0; q.push(front); vis[s]=true; while(!q.empty()) { temp=q.front(); if(temp.x==t) return temp.step; q.pop(); rear.step=temp.step+1; if(temp.x>t) { rear.x=temp.x-1; if(rear.x>=0&&rear.x<=MAXN&&!vis[rear.x]) q.push(rear),vis[rear.x]=true; } else { rear.x=temp.x+1; if(rear.x>=0&&rear.x<=MAXN&&!vis[rear.x]) q.push(rear),vis[rear.x]=true; rear.x=temp.x-1; if(rear.x>=0&&rear.x<=MAXN&&!vis[rear.x]) q.push(rear),vis[rear.x]=true; rear.x=temp.x*2; if(rear.x>=0&&rear.x<=MAXN&&!vis[rear.x]) { q.push(rear); vis[rear.x]=true; } } } return 0; } int main() { while(scanf("%d%d",&s,&t)!=EOF) { if(s>t) printf("%d ",s-t); else { printf("%d ",bfs()); } } return 0; }