搜索—catch the cow

[USACO07OPEN] Catch That Cow S

题目描述

FJ 丢失了他的一头牛,他决定追回他的牛。已知 FJ 和牛在一条直线上,初始位置分别为 \(x\)\(y\),假定牛在原地不动。FJ 的行走方式很特别:他每一次可以前进一步、后退一步或者直接走到 \(2\times x\) 的位置。计算他至少需要几步追上他的牛。

输入格式

第一行为一个整数 \(t\ ( 1\le t\le 10)\),表示数据组数;

接下来每行包含一个两个正整数 \(x,y\ (0<x,y \le 10^5)\),分别表示 FJ 和牛的坐标。

输出格式

对于每组数据,输出最少步数。

样例 #1

样例输入 #1

1 
5 17

样例输出 #1

4

分析

最短路径问题用bfs解决,每一步有3个分支,如果农夫位置大于k,只能不断x-1。

代码实现

#include <bits/stdc++.h>
using namespace std;
map<int,bool>mp;
int x,y;
struct node
{
	int val;
	int dis;
};

void bfs(){
	queue<node>q;
	node head;
	head.dis = 0;head.val = x;
	q.push(head);
	while(!q.empty()){
		head = q.front();
		q.pop();
		int v = head.val;
		int step = head.dis;
		if(v==y){
		cout<<step<<endl;
		break;
	}
			
			if(v>y&&v-1>=0){
				node now;now.val = v;now.dis = step;
				now.val--;
				if(!mp[now.val]){
					mp[now.val] = 1;
					now.dis++;
					q.push(now);
				}
			}
			else{
				for(int i = 1;i <= 3;i++){
					if(i==1){
						node now;now.val = v;now.dis = step;
						now.val++;
						if(!mp[now.val]){
						mp[now.val] = 1;
						now.dis++;
						q.push(now);
				}
					}
					if(i==2){
						node now;now.val = v;now.dis = step;
						now.val*=2;
						if(!mp[now.val]){
						mp[now.val] = 1;
						now.dis++;
						q.push(now);
					}
				}
				if(i==3){
						node now;now.val = v;now.dis = step;
						now.val--;
						if(!mp[now.val]){
						mp[now.val] = 1;
						now.dis++;
						q.push(now);
					}
				}
		
	}
}

}
}
int main()
{
	int t;cin>>t;
	while(t--){
		cin>>x>>y;
		mp.clear(); 
		bfs();
	}
	return 0;
}
posted @ 2023-08-21 02:25  LongDz  阅读(18)  评论(0)    收藏  举报