http://dsalgo.openjudge.cn/stackqueue/8/
太久不写代码了,再写发现犯好多低级错误。。。
因为只是求最短路径,因此使用广搜。但是如果直接广搜,会报Memory Limit Exceed错。
附一个报错代码
#include<stdio.h>
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
queue<int>bfsqueue;
int num = 0;//第i层的节点数量(第i步的可能位置有多少个)
bool iscaught = false;
void bfs(int K) {//进行广搜
int sum = 0;
while (num--) {
int temppos = bfsqueue.front();
bfsqueue.pop();
if (temppos - 1 >= 0) {
bfsqueue.push(temppos - 1);
sum++;
}
if (temppos + 1 <= 100000) {
bfsqueue.push(temppos + 1);
sum++;
}
if (temppos * 2 <= 100000) {
bfsqueue.push(temppos * 2);
sum++;
}
if (temppos - 1 == K || temppos + 1 == K || temppos * 2 == K)//当有节点到达K的位置,将iscaught置为true跳出循环
iscaught = true;
}
num = sum;//将num更新为新一层的节点数量
}
int main(){
int N, K;
cin >> N >> K;
int round = 0;
if (N == K)
iscaught = true;
bfsqueue.push(N);
num = 1;
while (!iscaught) {
round++;
bfs(K);
}
cout << round << endl;
return 0;
}
解决办法是设置一个bool数组,专门用于记录哪些位置已经被访问过了,这样剪枝之后就Accepted了!
附代码
#include<stdio.h>
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
queue<int>bfsqueue;
bool isreach[100010] = {0};//用来记录哪些位置在之前的步中已经到达了,避免再次访问导致Memory Limit Exceed
int num = 0;//第i层的节点数量(第i步的可能位置有多少个)
bool iscaught = false;
void bfs(int K) {//进行广搜
int sum = 0;
while (num--) {
int temppos = bfsqueue.front();
bfsqueue.pop();
if (temppos - 1 >= 0 && isreach[temppos - 1] == false) {
bfsqueue.push(temppos - 1);
isreach[temppos - 1] = true;
sum++;
}
if (temppos + 1 <= 100000 && isreach[temppos + 1] == false) {
bfsqueue.push(temppos + 1);
isreach[temppos + 1] = true;
sum++;
}
if (temppos * 2 <= 100000 && isreach[temppos * 2] == false) {
bfsqueue.push(temppos * 2);
isreach[temppos * 2] = true;
sum++;
}
if (temppos - 1 == K || temppos + 1 == K || temppos * 2 == K)//当有节点到达K的位置,将iscaught置为true跳出循环
iscaught = true;
}
num = sum;//将num更新为新一层的节点数量
}
int main(){
int N, K;
cin >> N >> K;
int round = 0;
if (N == K)
iscaught = true;
bfsqueue.push(N);
num = 1;
isreach[N] = true;
while (!iscaught) {
round++;
bfs(K);
}
cout << round << endl;
return 0;
}