标签:
链接:戳这里
题意:
x坐标轴上 人在位置n处 牛在位置k处, 人走到牛那里最少需要多少步
走的方式有三种:向左走、向右走、坐标位置*2
思路:bfs存下走到当前位置最少需要多少步 注意剪枝
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include <ctime> #include<queue> #include<set> #include<map> #include<stack> #include<iomanip> #include<cmath> #define mst(ss,b) memset((ss),(b),sizeof(ss)) #define maxn 0x3f3f3f3f #define MAX 1000100 ///#pragma comment(linker, "/STACK:102400000,102400000") typedef long long ll; typedef unsigned long long ull; #define INF (1ll<<60)-1 using namespace std; int vis[200100],n,k; struct node{ int x,step; node(int x=0,int step=0):x(x),step(step){} }; void bfs(){ mst(vis,0); queue<node> qu; qu.push(node(n,0)); vis[n]=1; while(!qu.empty()){ node now=qu.front(); qu.pop(); if(!vis[now.x+1] && now.x+1<100001){ if(now.x+1==k) { cout<<now.step+1<<endl; return ; } vis[now.x+1]=1; qu.push(node(now.x+1,now.step+1)); } if(!vis[now.x-1] && now.x-1>=0){ if(now.x-1==k) { cout<<now.step+1<<endl; return ; } vis[now.x-1]=1; qu.push(node(now.x-1,now.step+1)); } if(!vis[now.x*2] && now.x*2<100001){ if(now.x*2==k) { cout<<now.step+1<<endl; return ; } vis[now.x*2]=1; qu.push(node(now.x*2,now.step+1)); } } } int main(){ while(scanf("%d%d",&n,&k)!=EOF){ if(n==k) cout<<0<<endl; else bfs(); } return 0; }
标签:
原文地址:http://blog.csdn.net/libin66/article/details/51347388