码迷,mamicode.com
首页 > 其他好文 > 详细

广度优先搜索

时间:2016-08-20 01:33:33      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

给定两个整数N和K

通过 N+1或N-1 或N*2 这3种操作,使得N==K

输出最少的操作次数

-------------------------------------------------------------------------------------------

虽然不好完全确定,但是一个可能的原因是,函数的局部变量(包括局部的静态数组)是存储在堆栈而非内存中,若程序中局部数组过多过大则有栈溢出的可能导致错误(比如Windows下大致4MB)。大数组建议使用全局的堆(new 或者 malloc),不仅安全可控,而且可以提高效率。

-------------------------------------------------------------------------------------------

广度优先搜索算法如下:(用队列)

(1)       把初始节点s0放入Open表中;

(2)       如果Open表为空,则问题无解,失败退出;

(3)       把Open表的第一个节点取出放入Closed表,并记该节点为n;

(4)       考察节点n是否为目标节点。若是,则得到问题的解,成功退出;

(5)       若节点n不可扩展,则转第(2)步;

(6)       扩展节点n,将其不在Closed表和Open表中的子节点(判重)放入Open表的尾部,并为每一个子节点设置指向父节点的指针(或记录节点的层次),然后转第(2)步。

技术分享
#include<iostream>
#include<cstring>
#include<queue> 
using namespace std;
const int MAXN = 100000;
int visited[MAXN + 10] = {0};//判重标记,visited[i]=1表示i已经扩展过 
struct Step {
    int x; // 记录位置
    int steps; //记录步数 
    Step(int xx, int s) {   //可以存放位置信息 
        x = xx;
        steps = s;
    } 
};
queue<Step> q; 
int main() {
    int N,K;
    cin >> N >> K;
    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;
}
View Code

 

广度优先搜索

标签:

原文地址:http://www.cnblogs.com/cdx19971126/p/5789432.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!