思维训练(算法+技巧)
1.深度优先搜索:暴力求解,适合判断能不能走出迷宫
利用递归,有一个check【】数组来检查该节点是否经过
for循环该节点的邻接节点(存在且没被访问),递归DFS(该节点的某个邻接节点)
DFS(初始顶点v,图...)
check[v] = 访问;
for(int i=0;i<n;i++){
if(邻接节点存在&&check【i】==未访问)
DFS(邻接点)
}
2.广度优先搜索:适合找最短路径,最短走出迷宫
有一个check【】数组来检查该节点是否经过
利用队列,当前节点被访问,它的邻接节点加入队列
BFS(接受初始顶点v,图)
{
访问v;
check[v] = 访问;
Queue.push(v)
while(queue不为空)
{
Queue.pop(v);
遍历v的邻接结点for(i.....)
{
if(邻接节点存在且未访问)
{
访问该节点;
check【i】 = 访问;
i入队
}
}
}
}
3.对于一个数字,题目关于它的位数操作,可以用while循环配上%(取模),/(除法)来逐步减位数,进行操作
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>> n;
int sum=0;
for(int i=1;i<n+1;i++)
{
int x=i;
while(x>0)
{
int ge = x%10;
x/=10;
if((ge==2)||(ge==0)||(ge==1)||(ge==9))
{
sum+=i;
break;
}
}
}
cout<< sum;
return 0;
}
4.对于某组数字判断其是否包含某些数字,可以将该组数字排序,然后寻找
#include<bits/stdc++.h>
using namespace std;
//某人年龄立方是4位数,四次方是6位数,并且这10个数字包含了0-9,求这个年龄
bool panduan(long long cube,long long forth)
{
string s = to_string(cube)+to_string(forth);
//满足10个数字
if(s.size()==10)
{
//对这个字符串排序
sort(s.begin(),s.end());
for(int j=0;j<10;j++)
{
if(s[j] !='0'+j)
return false;
}
}
return true;
}
int main()
{
//估算出年龄在10-30之间
for(int i=10;i<30;i++)
{
long long cube = (i*i*i);
long long forth = (i*i*i*i);
int flag = false;
//满足位数条件
if((cube)>1000&&(cube)<10000&& (forth)>100000 && forth<1000000)
{
if(panduan(cube,forth)==true)
cout<<"年龄是:"<< i;
}
}
return 0;
}