广度优先遍历实现思路
- 构建辅助队列实现先进先出
- 构建访问集,给已经访问的结点进行标记
- 将起始结点加入队列
- 当队列非空时:
- 取出队首元素
- 将队首元素的所有邻居入队
- 访问队首元素
- 队列空即访问完毕
用途:求最优解
例题——catch that cow
代码
#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
struct info{
int pos;
int time;
};
int main() {
int n,k;
scanf("%d%d",&n,&k);
queue<info> pos_queue;
bool is_visited[100001]={false};
//起始点加入到队列
info first;
first.pos = n;
first.time = 0;
pos_queue.push(first);
while(pos_queue.empty()== false){
info current = pos_queue.front();
pos_queue.pop();
if (current.pos==k){
printf("%d\n",current.time);
break;
}
is_visited[current.pos]= true;
//邻居加入队列
info neighbor;
if (current.pos-1 >= 0 && current.pos-1<=100000&&is_visited[current.pos-1]== false){
neighbor.pos = current.pos-1;
neighbor.time = current.time+1;
pos_queue.push(neighbor);
}
if (current.pos+1 >= 0 && current.pos-1<=100000&&is_visited[current.pos-1]== false){
neighbor.pos = current.pos+1;
neighbor.time = current.time+1;
pos_queue.push(neighbor);
}
if (current.pos*2 >= 0 && current.pos-1<=100000&&is_visited[current.pos-1]== false){
neighbor.pos = current.pos*2;
neighbor.time = current.time+1;
pos_queue.push(neighbor);
}
}
return 0;
}
例题——Find The Multiple
题目描述
给出一个整数
n
n
n (
1
≤
n
≤
200
1\le n\le200
1≤n≤200)。求出任意一个它的倍数
m
m
m,要求
m
m
m 必须只由十进制的 0
或 1
组成。
输入输出格式
输入格式:
输入文件可能包含多个测试样例。每行包含一个 n n n ( 1 ≤ n ≤ 200 1\le n\le200 1≤n≤200)。包含零的行将终止输入。
输出格式:
对于输入中的 n n n, 输出对应的 m m m 。 m m m 用十进制表示,不能超过 100 100 100 位。如果 n n n 有多个解决方案, 则其中任何一个都是可以的。
输入输出样例
输入样例:
2
6
19
0
输出样例:
10
100100100100100100
111111111111111111
代码
#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <bits/stdc++.h>
using namespace std;
struct info{
int pos;
int time;
};
int main() {
int n;
while(true){
scanf("%d",&n);
if (n==0){
break;
}
queue<long long> m;
m.push(1);
while(m.empty()== false){
long long current = m.front();
m.pop();
if (current%n==0){
printf("%lld\n",current);
break;
}
m.push(current*10);
m.push(current*10+1);
}
}
return 0;
}