P1588 丢失的牛
题目描述
FJ丢失了他的一头牛,他决定追回他的牛。已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动。FJ的行走方式很特别:他每一次可以前进一步、后退一步或者直接走到2*x的位置。计算他至少需要几步追上他的牛。
输入输出格式
输入格式:
第一行为一个整数t(≤10),表示数据组数;接下来每行包含一个两个正整数x和y(0<x,y≤10^5),分别表示FJ和牛的坐标。
输出格式:
对于每组数据,输出最少步数。
输入输出样例
输入样例#1:
1 5 17
输出样例#1:
4 搜索什么鬼畜的边界、、在判断是否在超出边界时,先判断边界!注意末尾的换行!
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn(1e5+5); queue<int>q; int t,s,e,dis[maxn]; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘) ch=getchar(); while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();} return x*f; } void bfs(int s,int y) { while(!q.empty()) q.pop(); memset(dis,0x3f3f3f3f,sizeof(dis)); q.push(s); dis[s]=0; while(!q.empty()) { int x=q.front(); q.pop(); if(x==y) {printf("%d\n",dis[y]);return ;} if((2*x)<=maxn&&dis[2*x]>dis[x]+1) dis[x*2]=dis[x]+1,q.push(x*2); if((x-1)>0&&dis[x-1]>dis[x]+1) dis[x-1]=dis[x]+1,q.push(x-1); if((x+1)<=maxn&&dis[x+1]>dis[x]+1) dis[x+1]=dis[x]+1,q.push(x+1); } } int main() { t=read(); while(t--) { s=read(),e=read(); if(e<s) printf("%d\n",s-e); else bfs(s,e); } return 0; }
时间: 2024-10-12 15:22:23