0
点赞
收藏
分享

微信扫一扫

A. Game 23(思维或dfs或bfs多种解决方案) Codeforces Round #547 (Div. 3)

原题链接:​​https://codeforces.com/problemset/problem/1141/A​​​A. Game 23(思维或dfs或bfs多种解决方案)  Codeforces Round #547 (Div. 3)_acm竞赛
题意:给你一个整数n,可以有两种变化,扩大两倍或扩大三倍,问要经过多少步可以变成m, 若不行,则输出-1.

解题思路:根据题意我们可以知道若n可以变成m,则m一定可以整除n,且整除后得到的一定是2和3的倍数,我们只要统计即可。我们也可以把它看成是一道简单的搜索题,我们可以利用dfs或bfs进行解决,注意一定要细心,且此题要根据m来判断上下界,若已经大于m就没必要进行搜索了,同样也不必设置访问数组,因为是一直增大的,所以一个数字只可能出现一次。

AC代码

简单思维做法:

/*
*。
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<cstring>
#include<map>
#include<iterator>
#include<list>
#include<set>
#include<functional>
#include<memory.h>//低版本G++编译器不支持,若使用这种G++编译器此段应注释掉
#include<iomanip>
#include<vector>
#include<cstring>
#define scd(n) scanf("%d",&n)
#define scf(n) scanf("%f",&n)
#define scc(n) scanf("%c",&n)
#define scs(n) scanf("%s",n)
#define prd(n) printf("%d",n)
#define prf(n) printf("%f",n)
#define prc(n) printf("%c",n)
#define prs(n) printf("%s",n)
#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为代码自定义代码模板***************************************//

ll n,m,sum;
int main(){
//freopen("in.txt", "r", stdin);//提交的时候要注释掉
ios::sync_with_stdio(false);//打消iostream中输入输出缓存,节省时间。
cin.tie(0); cout.tie(0);//可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
while(cin>>n>>m){
if(m%n)
cout<<"-1"<<endl;
else{
m/=n;
sum=0;
while(m%3==0){
sum++;
m/=3;
}
while(m%2==0){
sum++;
m/=2;
}
if(m>1)
cout<<"-1"<<endl;
else
cout<<sum<<endl;
}
}
return 0;
}

DFS做法:

/*

*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<cstring>
#include<map>
#include<iterator>
#include<list>
#include<set>
#include<functional>
#include<memory.h>//低版本G++编译器不支持,若使用这种G++编译器此段应注释掉
#include<iomanip>
#include<vector>
#include<cstring>
#define scd(n) scanf("%d",&n)
#define scf(n) scanf("%f",&n)
#define scc(n) scanf("%c",&n)
#define scs(n) scanf("%s",n)
#define prd(n) printf("%d",n)
#define prf(n) printf("%f",n)
#define prc(n) printf("%c",n)
#define prs(n) printf("%s",n)
#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
const int inf = 0x3f3f3f3f;//无穷大
const long long maxn = 5e9+1;//最大值。
//*******************************分割线,以上为代码自定义代码模板***************************************//

ll n,m;
ll result;
void dfs(ll n,ll sum){
if(n==m){
result=sum;
return;
}
ll temp;
rep(i,0,1){
if(i==0){
temp=n*2;
}
else
temp=n*3;
if(temp<=maxn){
dfs(temp,sum+1);
}
}
return;
}
int main(){
//freopen("in.txt", "r", stdin);//提交的时候要注释掉
ios::sync_with_stdio(false);//打消iostream中输入输出缓存,节省时间。
cin.tie(0); cout.tie(0);//可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
while(cin>>n>>m){
result=-1;
dfs(n,0);
cout<<result<<endl;
}
return 0;
}

BFS做法:

/*

*注:代码如有问题请私信我或在评论区留言,谢谢支持。
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<cstring>
#include<map>
#include<iterator>
#include<list>
#include<set>
#include<functional>
#include<memory.h>//低版本G++编译器不支持,若使用这种G++编译器此段应注释掉
#include<iomanip>
#include<vector>
#include<cstring>
#define scd(n) scanf("%d",&n)
#define scf(n) scanf("%f",&n)
#define scc(n) scanf("%c",&n)
#define scs(n) scanf("%s",n)
#define prd(n) printf("%d",n)
#define prf(n) printf("%f",n)
#define prc(n) printf("%c",n)
#define prs(n) printf("%s",n)
#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define fi first
#define se second
#define mp make_pair
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
const ll inf = 0x3f3f3f3f;//无穷大
const ll maxn = 1e5;//最大值。
//*******************************分割线,以上为代码自定义代码模板***************************************//

struct node{
ll x;
ll step;
};
ll n,m;
void bfs(){
queue<node> q;
node temp,head;
head.x=n;head.step=0;
q.push(head);
while(!q.empty()){
head=q.front();
q.pop();
if(head.x==m){
cout<<head.step<<endl;
return;
}
rep(i,0,1){
if(i==0){
temp.x=2*head.x;
}
else
temp.x=3*head.x;
if(temp.x>m)continue;
temp.step=head.step+1;
q.push(temp);
}
}
cout<<"-1"<<endl;
}
int main(){
//freopen("in.txt", "r", stdin);//提交的时候要注释掉
ios::sync_with_stdio(false);//打消iostream中输入输出缓存,节省时间。
cin.tie(0); cout.tie(0);//可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。
while(cin>>n>>m){
bfs();
}
return 0;
}


举报

相关推荐

0 条评论