商城网站开发哪家好百度推广代理商赚钱吗
题意:
给出农夫和牛的位置,求农夫抓到牛的最短时间,农夫可以选择前进一步,后退一步,当前位置坐标变成两倍。每做出一次选择都要花费一秒、
思路:
以前是用数组做的,现在重新用队列做了一遍,vis标记的时候=打成==,结果死循环。
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define mx 100000
using namespace std;struct aa{int x,bu;aa(int x_=0,int bu_=0){x=x_;bu=bu_;}};queue<aa>q;int st,en,vis[100010];int bfs(int st){aa now;q.push(aa(st,0));vis[st]=1;while(!q.empty()){now=q.front();q.pop();int x=now.x;if(x==en) return now.bu;if(x<en){if(x-1>=0&&vis[x-1]==0){// cout<<"后退"<<endl; vis[x-1]=1;q.push(aa(x-1,now.bu+1)); }if(x+1<=mx&&vis[x+1]==0){//youhua// cout<<"前进"<<endl; vis[x+1]=1;q.push(aa(x+1,now.bu+1)); }if(2*x<=mx&&vis[2*x]==0){// cout<<"两倍"<<endl; vis[2*x]=1; q.push(aa(2*x,now.bu+1)); }}else{if(x-1>=0&&vis[x-1]==0){// cout<<"过头后退"<<endl; vis[x-1]=1;q.push(aa(x-1,now.bu+1)); }}}}int main(){while(scanf("%d%d",&st,&en)!=EOF){if(!q.empty()) q.pop();memset(vis,0,sizeof(vis));printf("%d\n",bfs(st));}return 0;}