这种搜索方式占用内存较大,但能找到最优解。按照层次,走几步能走到的点就就在第几层。
poj3278
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int N,K;
const int maxn = 10000;
int visited[maxn+10]; 判重标记,visited[i]=true 代表i已经扩展过
struct step{
int x;
int steps;
step(int xx,int s);x(xx),step(s){}
};
queue < step >q; 队列,即open表
int main() {
cin >> n>>k;
memset(visited,0,sizeof(visted));
q.push(step(N,0));
visited[N] = 1;
while(!=q.empty()){
step s = q.front();
if(s.x == k){
cout << s.steps << endl;
return 0;
}
else{
if(s.x-1>=0&&!visited[s.x-1]){
q.push(step(s.x-1,s,steps+1));
visited[s.x-1] = 1;
}
if(s.x+1<=maxn &&!visited[s.x+1]){
q.push(step(s.x+1,s,steps+1));
visited[s.x+1] = 1;
}
if(s.x*2<=maxn &&!visited[s.x*2]){
q.push(step(s.x*2,s,steps+1));
visited[s.x*2]=1;
}
q.pop();
}
}
return 0;
}