从n到m,有-1和*2两种操作。问最少走几步
2016-03-18 23:20
441 查看
从n到m,有-1和*2两种操作。问最少走几步。
这题必须从m来逆向考虑。
另一题:从n到m,有-1和+1和*2三种操作。问最少走几步。
后来想了想记忆化搜索真的是行不通的,会重复取状态。
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <cstdio>
#include <map>
#include <set>
#include<queue>
using namespace std;
int vis[200005];
queue<pair<int,int> > q;
int main(){
int n,m;
cin>>n>>m;
int s=0;
q.push(make_pair(n,0));
while(!q.empty()){
int fr=q.front().first;
int p=q.front().second;
q.pop();
if(fr>200000||fr<0) continue;
if(vis[fr]==1) continue;
vis[fr]=1;
if(fr==m){
s=p;
break;
}
q.push(make_pair(fr-1,p+1));
q.push(make_pair(fr+1,p+1));
q.push(make_pair(fr*2,p+1));
}
cout<<s<<endl;
}
这题必须从m来逆向考虑。
#include <>bits/stdc++.h> using namespace std; int main(){ int count =0; int m,n; cin>>n>>m; while(n < m){ if(m%2) m++; else m/=2; count++; } cout<<count+n-m<<endl; }
另一题:从n到m,有-1和+1和*2三种操作。问最少走几步。
后来想了想记忆化搜索真的是行不通的,会重复取状态。
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <cstdio>
#include <map>
#include <set>
#include<queue>
using namespace std;
int vis[200005];
queue<pair<int,int> > q;
int main(){
int n,m;
cin>>n>>m;
int s=0;
q.push(make_pair(n,0));
while(!q.empty()){
int fr=q.front().first;
int p=q.front().second;
q.pop();
if(fr>200000||fr<0) continue;
if(vis[fr]==1) continue;
vis[fr]=1;
if(fr==m){
s=p;
break;
}
q.push(make_pair(fr-1,p+1));
q.push(make_pair(fr+1,p+1));
q.push(make_pair(fr*2,p+1));
}
cout<<s<<endl;
}
相关文章推荐
- mac jdk原因导致 maven命令无法执行
- 13. 精确计算使用BigDecimal
- gcc命令大全
- 第一次上机实验1-2
- Linux内存管理之mmap详解
- Android——Activity和Intent及Activity的生命周期
- 监听滚动window.onscroll scrlltop被卷去的头部
- 手写毛笔字效果-手机版
- DNS的功能和原理?(总结)
- 成长需要环境
- HDU 1312 Red and Black(经典搜索,DFS&BFS三种方式)
- 【BZOJ4034】T2,树链剖分练习
- 基础篇(十四) 进程间通信
- 自适应布局
- 仿照支付宝可拖动gridview
- HDU 小明系列故事——师兄帮帮忙
- gcc 和 gdb简介
- Swizzling钩子
- 栈的源代码C/C++实现
- 我的单元测试