高精度加法:
#include<bits/stdc++.h>
using namespace std;
string a, b, c, d, s;
int sum = 0;
int e;
int main(){
cin>>a;
cin>>b;
// cout<<a<<endl<<b;
if(a.length()<b.length()){
c = a;//小
d = b;//大
}
else {
c = b;
d = a;
}
int cha = a.length() - b.length();
e = abs(cha);//差
for(int i = 0; i < e; i++){
c = '0' + c;
}
s = d;
for(int i = d.length() - 1; i >= 0; i--){
s[i] = (int(c[i] - '0') + int(d[i] - '0') + sum)%10 + '0';
sum = (int(c[i] - '0') + int(d[i] - '0') + sum)/10;
}
if(sum!=0) s = char(sum + '0') + s;
cout<<s;
return 0;
}
哈夫曼树(Huffman)
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
int a[100];
int i,n;
int sum=0;
int main () {
cin>>n;
for(i=0; i<n; i++)
cin>>a[i];
sort(a,a+n);
//sort函数一般是(start, end, cmp)类似这样的使用方法,默认从小到大 ,st,ed是排序区间,但是区间是左闭右开的,
//比如sort(a + 1, a + 6)的话就是从a的第2个元素开始,排序到a的第6个元素,也就是从a[1]排序到a[5].
while(n>1) {
a[0]+=a[1];//排序后,a[0]最小,a[1]第二小
sum+=a[0];
a[1]=-1;//在正整数环境下
sort(a,a+n);
//数组往前移,覆盖掉-1
for(i=0; i<n; i++) {
a[i]=a[i+1];
}
n--;
}
cout<<sum ;
return 0;
}
//不要想在原排列中找最小和第二小,而是在排列好的里面找
放置皇后问题(回溯法):
①n皇后问题:
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
#include<iostream>
#include <math.h>
#define N 8
using namespace std;
int num=0;
int cur[8];//表示第i行放在得第j列(下标为i,值为j)
//判断当前放置的行列是否合适
int check(int n){//n是行
for(int i=0;i<n;i++){
if(cur[i]==cur[n]||abs(n-i)==abs(cur[n]-cur[i])){//是否在同一列或同斜列
return 0;
}
}
return 1;
}
void putQueen(int n){
if(n==N){
num++;
}else{
for(int j=0;j<N;j++){
cur[n]=j;//记录下当前行的当前列, 一行只放一个
if(check(n)){
putQueen(n+1);//开始进行下一行的放置
}
}
}
}
int main(){
putQueen(0);
cout<<num;
return 0;
}
②黑白皇后问题
#include<iostream>
#include <math.h>
int N;
using namespace std;
int chess[8][8];
int num=0;
int blackCur[8];
int whiteCur[8];
//检查列,对角线
int check(int n,int Cur[]) { //传进来行
for(int i=0; i<n; i++) {
if( Cur[i] == Cur[n] || abs(n-i) == abs(Cur[n] - Cur[i])) { //判断当前放置的位置是否与之前的放置位置是否在同一列或同斜列
return 0;
}
}
return 1;
}
//放置白皇后
void whiteQueen(int n) {
if(n==N) {
num++;
} else {
for(int j=0; j<N; j++) {
if( blackCur[n]!=j && chess[n][j]!=0) {
whiteCur[n]=j;
if(check(n,whiteCur)) {
whiteQueen(n+1);
}
}
}
}
}
//放置黑皇后
void blackQueen(int n) {
if(n==N) {
whiteQueen(0);//黑皇后放置成功开始放置白皇后
} else {
for(int j = 0; j < N; j++) { //列的位置从0往最后放置
if(chess[n][j]!=0) {
blackCur[n]=j;//记录下当前行的当前列
if(check(n,blackCur)) { //判断当前放置的行列是否合适
blackQueen(n+1);//开始进行下一行的放置
}
}
}
}
}
int main() {
cin>>N;
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
cin>>chess[i][j];
}
}
blackQueen(0);
cout<<num;
return 0;
}
//思路:要先放完一种皇后,在放完另一种