大家好,我又回来了!下面为大家介绍一下我们程序员最常用的几种算法!!
第一就是模拟算法了,模拟算法是最简单的,也是比较烦人的算法,look look 他的介绍
如何把实际问题建模成数学问题,主要依靠我们的经验和直觉、当然还有你灵动的思维;而算法与数据结构,正是解决数学问题的两把利剑。从这一章开始会介绍一些程序设计竞赛中的一些常见套路算法,而下一部分会介绍基础的数据结构。如果已经认真学
习完了第一部分,相信这一部分也不在话下。这一章是语言部分的延伸,会介绍一些竞赛中会出现的“模拟题目”——这里的“模拟”不是指模拟某场比赛的模拟题,而是指让程序完整的按照题目叙述的方式执行运行得到最终答案。同时也会介绍可以计算很大整数
的高精度运算方法。这一章对思维与算法设计的要求不高,但是会考验编程的基本功是否扎实。
这种题呢没有什么模板,全靠思维,那练习题呢就放在这了题单这种算法就不讲了哈,有问题可以私下联系小编。
第二种递归算法,主要就是时间复杂度太高,但是解题十分强大,就不多说了,后面的搜索与回溯算法会用到这种思想。顺便送你道例题,汉诺塔问题。
自己好好思考一下。
#include <bits/stdc++.h>
using namespace std;
void dg(int n, char a, char c, char b) {
if (n == 1) {
printf("%c->%d->%c\n", a, n, b);
return;
}
dg(n - 1, a, b, c);
printf("%c->%d->%c\n", a, n, b);
dg(n - 1, c, a, b);
}
int main() {
int n;
char a, b, c;
cin >> n >> a >> b >> c;
dg(n, a, c, b);
return 0;
}
下面就是递推算法了,主要就是找规律,最经典的例题就是斐波那契数列了题目就不说了,大家自己看看代码,找出递推式* a[i]=a[i-1]+a[i-2]*就出来了
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,a[10005];
signed main() {
cin>>n;
a[0]=0;
a[1]=1;
a[2]=1;
for(int i=3;i<=n;i++) {
a[i]=a[i-1]+a[i-2];
}
cout<<a[n-1];
}
第四种就是搜索与回溯算法,也就是深度优先搜索算法,十分简单,不要有心理压力,其实不难,无非就是一个个找,找不到就返回,找到了就继续找,找完了返回,就完了。
模板:
void dfs(int x) {
if(是否满足条件,到终点了没) {
该干嘛干嘛;
return ;
}
for(int i=1;i<=n;i++/*这个随着变量来就行*/) {
if(判断一下是否用过) {
标记成用过;
记录答案;
dfs(x+1);//向下找
标记成没用过;
}
}
}
//完美结束
看,是不是十分简单?如果你还不懂,可以用C++调试一下,问题就解决了。如果不知道如何C++调试的,我会再写一篇帖子来教你如何调试。
再看一道经典例题,全排列!!
全排列问题
题目描述
按照字典序输出自然数 1 1 1 到 n n n 所有不重复的排列,即 n n n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 n n n。
输出格式
由 1 ∼ n 1 \sim n 1∼n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5 5 5 个场宽。
样例 #1
样例输入 #1
3
样例输出 #1
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
提示
1 ≤ n ≤ 9 1 \leq n \leq 9 1≤n≤9。
#include <bits/stdc++.h>
using namespace std;
int a[15], n;
bool c[15];
void dg(int f) {
if (f > n) {
for (int i = 1; i <= n; i++) {
cout<<setw(5)<<a[i];
}
printf("\n");
return;
}
for (int i = 1; i <= n; i++) {
if (c[i] == 0) {
c[i] = 1;
a[f] = i;
dg(f + 1);
c[i] = 0;
}
}
}
int main() {
scanf("%d", &n);
dg(1);
return 0;
}
你看是不是套着模板来的,十分简单。
圆满结束!!!!!