题意:两个整数,N 和 M,N有三种变换:-1 ,+1 , *2 ,求N通过这三种变换变为M的最小的次数
分析:这题用BFS。
这题的问题主要是:
1.难以想到用BFS来做
知道用BFS之后就很快的写出来代码,但是还是出错了:
2.TLE。原因是没有标记出现过的数,广搜一定要记得标记
3.RE。 N的范围在0到1000000,要把N的范围限制在这里面
4.WA。有一种特殊情况 N=M,要单独讨论(BFS和DFS出现WA的时候如果算法都没错那基本上就是一些特殊情况没有考虑到,所以做题的时候最好先把这些情况提出来)
#include<iostream> #include<cstring> #include<queue> using namespace std; int n,m; struct h{ int w,g; }; queue<h> q; int cnt; int vis[1000009]; int bfs() { h tmp; int t; while(!q.empty()){ tmp=q.front(); t=tmp.g; q.pop(); h tmp2; for(int i=0;i<3;i++){ switch(i){ case 0:tmp2.w=tmp.w-1;break; case 1:tmp2.w=tmp.w+1;break; default:tmp2.w=2*tmp.w; } if(tmp2.w>=0&&tmp2.w<=100000){ if(tmp2.w==m) return t+1; if(!vis[tmp2.w]){ vis[tmp2.w]=1; tmp2.g=t+1; q.push(tmp2);}} } } } int main() { memset(vis,0,sizeof(vis)); cin>>n>>m; if(n==m) cout<<"0"<<endl; else{ h tmp; tmp.w=n,tmp.g=0; vis[n]=1; q.push(tmp); cnt=bfs(); cout<<cnt<<endl;} return 0; }
时间: 2025-01-01 13:44:11