BFS练习1 - 题目 - Daimayuan Online Judge
题意:
你可以把一个数a变成a+1,a-1,a*2,a*3四种状态,问你a变成b一共需要几步?
思路:
对于BFS的最短路题,首先我们先把一个状态会一次性变成哪几种状态存入数组里,然后去遍历这些一次就可以转移的状态,如果满足条件(没更新过dis数组且数还不够大)就去更新dis数组
跑了一遍BFS后,dis数组就算出来了,接下来只需要调用数组即可
Code:
#include <bits/stdc++.h>
using namespace std;
const int mxn=1e6+10;
int q,a,x;
int dis[mxn];
queue<int> q2;
bool check(int x){
if(x<1||x>(int)1e5) return false;
return true;
}
void change(int u,int v){
if(dis[v]==0x3f3f3f3f&&check(v)){
dis[v]=dis[u]+1;
q2.push(v);
}
}
void bfs(int x){
memset(dis,0x3f,sizeof(dis));
dis[x]=0;
q2.push(x);
while(!q2.empty()){
int tmp=q2.front();
q2.pop();
change(tmp,tmp+1);
change(tmp,tmp-1);
change(tmp,tmp*2);
change(tmp,tmp*3);
}
}
int main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin>>a>>q;
bfs(a);
for(int i=1;i<=q-1;i++){
cin>>x;
cout<<dis[x]<<" ";
}
cin>>x;cout<<dis[x]<<endl;
}
总结:(BFS最短路问题)
1.先去考虑状态一次可以变成哪几种状态,可以存数组里也可以存别的地方
2.然后对于一次就可以变成的状态进行更新dis数组(别忘记设置出口,即设置if条件)
3.对dis数组进行调用即可