首页 > 其他 > 详细

题解 CF1141A 【Game 23】

时间:2020-05-09 21:13:47      阅读:53      评论:0      收藏:0      [点我收藏+]

这题也可以算你咕最水的几道黄题之一了,做题的人大部分都是新手(或者是像我这样喜欢刷水题的人),我就讲的详细一点。

既然是求最少的步骤,那就肯定首选 BFS,但是题解里没有,那我就发一篇用 STL 的 queue 做的 BFS 吧。

本题的衍生状态只有两种,即 \(n\times2\)\(n\times3\),直接爆搜就可以过。如果 \(n\) 已经超过了 \(m\),就剪枝,非常好理解。

if(now.num*2<=m)   //剪枝,当 n>m 时就没必要继续搜了。 
{
	node nex;
	nex.num=now.num*2;     //num 代表此时的数字。 
	nex.sum=now.sum+1;     //sum 用来存储所用的步数。 
	q.push(nex);           //入队 
}
if(now.num*3<=m)  //同上 
{
	node nex;
	nex.num=now.num*3;
	nex.sum=now.sum+1;
	q.push(nex);
}

\(n=m\) 时,根据 BFS 的特性,所需的步骤肯定是最少的,不用像 DFS 一样把所有情况都搜完。此时就可以直接输出,结束程序。

if(now.num==m)
		{
			cout<<now.sum;
			exit(0);    //exit(0) 和 return 的区别是:return 只能终止当前的函数,exit(0)可以终止整个程序。 
		}

当 BFS 的函数结束之后程序还在运行,那么就说明无解,输出 -1

总之,这题是一道极其入门的搜索题,思路简单明了,适合刚学习搜索的小白练手,也可以供各位神犇练习手速。

上可爱的完整代码:

#include<bits/stdc++.h>
using namespace std;
struct node     //使用结构体。
{
	int num,sum;
}first;
queue<node> q;   //我爱 STL。
int n,m;
inline void bfs()   //inline 是为了加速。
{
	while(q.empty()==0)
	{
		node now=q.front();
		q.pop();
		if(now.num==m)
		{
			cout<<now.sum;
			exit(0);    
		}
		if(now.num*2<=m)    
		{
			node nex;
			nex.num=now.num*2;     
			nex.sum=now.sum+1;     
			q.push(nex);          
		}
		if(now.num*3<=m) 
		{
			node nex;
			nex.num=now.num*3;
			nex.sum=now.sum+1;
			q.push(nex);
		}
	}
}
int main() 
{
	cin>>n>>m;
	if(n>m)
	{
		cout<<-1;
		return 0;
	}
	first.num=n;
	first.sum=0;
	q.push(first);
	bfs();
	cout<<-1;
   return 0;
}

逃(

题解 CF1141A 【Game 23】

原文:https://www.cnblogs.com/win10crz/p/12859692.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!