首先是bfs是广度优先搜索,dfs是深度优先搜索,dfs多用于求找最小值,最小路径的问题。相比dfs来说,bfs更能够一层层的筛选。
以下是今天写的第一道关于bfs的题目,因为是新手,对于bfs的基础知识不是很了解,因此直接看题解才理解了这道题。
题目:super lucky number是只含有 44,77 且 44 的位数等于 77 的位数的数字;寻找大于等于 n(1\leq n\leq 10^9)n(1≤n≤109) 的最小super lucky number。
输入 输出
4500 4747
以下是代码段注释很详细。
#include<iostream>
#include<queue>//队列的头文件
using namespace std;
queue<int>q;//定义队列q.
int n;
bool bfs(int x)
{
if (x < n)
return 0;//不满足题意的数那么直接跳出来
int t=x, ans = 0, bns = 0;
while (x != 0)
{
t = x % 10;
x = x / 10;//这是取末位数的正常操作
if (t == 4)
ans++;
else if (t == 7)
bns++;
else
return 0;
}
if (ans == bns)//满足题目条件,使得4和7的数量一致
return 1;
else
return 0;
return 0;
}
int main()
{
cin >> n;
q.push(0);//把零放进去占个位置保证下面的循环顺利进行
while (!q.empty())
{
int num = q.front();//取出先进队列的数字
q.pop();//让先进去的数出队列,保证队首的数持续更新
if (bfs(num) == 1)
{
cout << num;
return 0;
}
q.push(num * 10 + 4);
q.push(num * 10 + 7);//因为queue先进先出的特点,所以这里不能调换顺序
}
}