广度优先搜索入门

广度优先搜素:

  广度优先搜素并不像深度优先搜素那样一个节点遍历到底,而是一层一层的遍历,

  不同与深搜,该算法使用了队列。

  广度优先算法:

     

   

  例题:

    

  代码:

    

/*农夫找牛*/
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;


int N,K;//N为农夫的位置,K为牛的位置 
const int MAXN=100000;
int visited[MAXN+10];//判重标记,visited[i]=true 表示i已经拓展过 

//表示一个坐标 
struct Step{
    int x;//位置
    int steps;//到达所需要的步数
    Step(int xx,int s):x(xx),steps(s){}//参数初始化  
};

queue<Step>q;//队列,即OPEN表
int main(){
    cin>>N>>K;
    memset(visited,0,sizeof(visited));//初始化,表示都没走过
    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));//压入队列,且步数+1 
                visited[s.x-1]=1;
            }
            if(s.x+1>=0&&!visited[s.x+1])
            {
                q.push(Step(s.x+1,s.steps+1));//压入队列,且步数+1 
                visited[s.x+1]=1;
            }
            if(s.x*2>=0&&!visited[s.x*2])
            {
                q.push(Step(s.x*2,s.steps*2));//压入队列,且步数+1 
                visited[s.x*2]=1;
            }
            q.pop();//如果相邻结点都遍历完了或没有相邻结点,就出队 
        }
        
        
        
        
        
    }
    return 0;
} 
View Code

 

  

 

猜你喜欢

转载自www.cnblogs.com/printwangzhe/p/12333347.html