标签:
给定两个整数N和K
通过 N+1或N-1 或N*2 这3种操作,使得N==K
输出最少的操作次数
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
广度优先搜索算法如下:(用队列)
(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; }
标签:
原文地址:http://www.cnblogs.com/cdx19971126/p/5789432.html