广度优先搜索入门
广度优先搜素:
广度优先搜素并不像深度优先搜素那样一个节点遍历到底,而是一层一层的遍历,
不同与深搜,该算法使用了队列。
广度优先算法:
例题:
代码:
/*农夫找牛*/ #include#include 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; }#include 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 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< endl;