【C - Catch That Cow 】

80 篇文章 0 订阅
80 篇文章 0 订阅

思路:

  • 以后再见就会了~
  • 广搜的小变体:因为:每次有三种移动方式,用过的点不会再用。

代码:

  • 47ms 1164kB
//47ms		1164kB 


#include <iostream>
#include <cstring>
#include <queue>
//严防数组越界造成RE
//vis只在判断是否加入新点时使用,check 中不用 
//特判 
using namespace std;

struct node{
	int x;
	int dis;
	friend bool operator > (node a , node b){
		return a.dis > b.dis;
	}
	node(int x,int dis) : x(x) , dis(dis) {} ;
};
int ans;
int n,k;
priority_queue<node , vector<node> , greater<node> > Q;
bool vis[100005];

bool check(int x){
	if(x > 100000 || x < 0)
		return false;
	return true;
}

void bfs(){
	if(n == k){
		ans = 0;
		return ;
	} 
	Q.push(node(n,0));
	vis[n] = 1;
	while(!Q.empty()){
		node cur = Q.top() ; Q.pop() ;
		if(!check(cur.x))
			continue ; 
		if(cur.x + 1 == k || cur.x - 1 == k || cur.x * 2 == k){
			ans = cur.dis + 1;
			break;
		}
		if(check(cur.x + 1) && !vis[cur.x + 1])
			Q.push(node(cur.x + 1 , cur.dis+1)),vis[cur.x + 1] = true;
		if(check(cur.x - 1) && !vis[cur.x - 1])
			Q.push(node(cur.x - 1 , cur.dis+1)),vis[cur.x - 1] = true;
		if(check(cur.x * 2) && !vis[cur.x * 2])
			Q.push(node(cur.x * 2 , cur.dis+1)),vis[cur.x * 2] = true;
	}
	return ;
}


int main(){
	cin>>n>>k;
	memset(vis , 0 , sizeof(vis));
	bfs();
	cout<<ans<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值