分类: C/C++

11 篇文章

C++ 深度优先搜索 课堂笔记 + 例题题解
深度优先搜索DFS是可用于遍历树或者图的搜索算法,DFS与回溯法类似,一条路径走到底后需要返回上一步,搜索第二条路径。在树的遍历中,首先一直访问到最深的节点,然后回溯到它的父节点,遍历另一条路径,直到遍历完所有节点。图也类似,如果某个节点的邻居节点都已遍历,回溯到上一个节点。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用栈数据结构来辅助实现DFS算法。
插入排序算法

插入排序基本思想

插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

insertionSort.gif

冒泡排序算法

冒泡排序核心思想

冒泡排序就是把逆序的元素进行交换,每次都是相邻的两个元素比较,交换也发生在这两个元素之间。

所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,

CSP-J 2023 第二轮认证 题解

[CSP-J 2023] 小苹果

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n;
    int cnt = 0, ans = 0;
    while (n > 0) {
        cnt++;
        if (ans == 0 && n % 3 == 1) ans = cnt;
        n -= (n + 2) / 3;
    }
    cout << cnt << " " << ans << "\n";
    return 0;
}
CSP-S 2023 第二轮认证 题解

密码锁

#include <bits/stdc++.h>
int n;
int a[13][7], b[7];
bool check(int i) {
int cnt = 0;
for(int j = 1; j <= 5; j++) cnt += (a[i][j] != b[j]);
if(cnt == 1) return true;
else if(cnt != 2) return false;
for(int j = 1; j < 5; j++)
if(a[i][j] != b[j] && a[i][j + 1] != b[j + 1] && (b[j] - a[i][j] + 10) % 10 == (b[j + 1] - a[i][j + 1] + 10) % 10) return true;
return false;
}
bool check() {
for(int i = 1; i <= n; i++) if(!check(i)) return false;
return true;
}
int main() {
freopen("lock.in", "r", stdin);
freopen("lock.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; i++) for(int j = 1; j <= 5; j++) scanf("%d", &a[i][j]);
int ans = 0;
for(b[1] = 0; b[1] <= 9; b[1]++)
for(b[2] = 0; b[2] <= 9; b[2]++)
for(b[3] = 0; b[3] <= 9; b[3]++)
for(b[4] = 0; b[4] <= 9; b[4]++)
for(b[5] = 0; b[5] <= 9; b[5]++)
ans += check();
printf("%d\n", ans);
return 0;
}