抓住那头牛 OJ

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;
}

 

上一篇:杭电OJ 11页2025//查找其中的最大字母,在该字母后面插入字符串“(max)”


下一篇:数据结构C++版 王红梅 OJ习题