哈夫曼树
这里使用优先队列(小根堆)进行构建,并且使用查探法在数组中寻找新建结点的位置。
输入一个字符串, 输出它的哈夫曼编码
#include <bits/stdc++.h>
#define remilia int
#define isMyWife main
using namespace std;
const int N = 10000;
// 记录权值
int times[30], n, index = 30;
int val[N], ls[N], rs[N];
string s;
// 小根堆, 使用pair
priority_queue<pair<int, int>,
vector<pair<int, int> >,
greater<pair<int, int> >> pq;
// 记录每个点对应二进制01
unordered_map<int, string> ump;
// 遍历找到01
void preorder(int cur) {
if (ls[cur]) {
ump[ls[cur]] = ump[cur] + "0";
}
if (rs[cur]) {
ump[rs[cur]] += ump[cur] + "1";
}
if (ls[cur]) {
preorder(ls[cur]);
}
if (rs[cur]) {
preorder(rs[cur]);
}
}
remilia isMyWife() {
cin >> n;
while (n--) {
cin >> s;
for (auto e : s) {
times[e - 'a' + 1]++;
}
for (int i = 1; i <= 26; i++) {
if (times[i]) {
val[i] = times[i];
pq.push({val[i], i});
}
}
// 合并树
while (pq.size() > 1) {
// index1 < index2
auto index1 = pq.top();
pq.pop();
auto index2 = pq.top();
pq.pop();
while (val[index]) {
index++;
}
val[index] = index1.first + index2.first;
ls[index] = index1.second;
rs[index] = index2.second;
pq.push({val[index], index});
}
int root = max_element(val + 1, val + N + 1) - val;
ump[root] = "";
preorder(root);
for (auto e : s) {
cout << ump[e - 'a' + 1];
}
putchar('\n');
memset(times, 0, sizeof times);
memset(val, 0, sizeof val);
memset(ls, 0, sizeof ls);
memset(rs, 0, sizeof rs);
ump.clear();
while (pq.size()) {
pq.pop();
}
index = 30;
}
return 0;
}
八皇后
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int n;
bool line[20] , diagonal[20] , diagonal_reverse[20];
char map[10][10];
void Check_challenge( int x ) {
if ( x >= n ) {
for ( int i = 0 ; i < n ; i++ ) {
for ( int j = 0 ; j < n ; j++ ) {
cout << map[i][j];
}
cout << '\n';
}
cout << '\n';
return;
}
for ( int i = 0 ; i < n ; i++ ) {
if ( !line[i] && !diagonal[i + x] && !diagonal_reverse[n - i + x]) {
line[i] = 1;
diagonal[i + x] = 1;
diagonal_reverse[n - i + x] = 1;
map[x][i] = 'Q';
Check_challenge( x + 1 );
line[i] = 0;
diagonal[i + x] = 0;
diagonal_reverse[n - i + x] = 0;
map[x][i] = '.';
}
}
}
int main() {
cin >> n;
for ( int i = 0 ; i < n ; i++ ) {
for ( int j = 0 ; j < n ; j++ ) {
map[i][j] = '.';
}
}
Check_challenge( 0 );
return 0;
}