L棋盘覆盖
#include <iostream>
#include <cmath>
using namespace std;
static int tile = 1;
static int board[100][100];
void chessBoard(int tr, int tc, int dr, int dc, int size)
{
if (size == 1) return;
int t = tile++, // L型骨牌号
s = size/2; // 分割棋盘
// 覆盖左上角子棋盘
if (dr < tr + s && dc < tc + s)
// 特殊方格在此棋盘中
chessBoard(tr, tc, dr, dc, s);
else {// 此棋盘中无特殊方格
// 用 t 号L型骨牌覆盖右下角
board[tr + s - 1][tc + s - 1] = t;
// 覆盖其余方格
chessBoard(tr, tc, tr+s-1, tc+s-1, s);}
// 覆盖右上角子棋盘
if (dr < tr + s && dc >= tc + s)
// 特殊方格在此棋盘中
chessBoard(tr, tc+s, dr, dc, s);
else {// 此棋盘中无特殊方格
board[tr + s - 1][tc + s] = t;
// 覆盖其余方格
chessBoard(tr,tc+s,tr+s-1,tc+s,s);}
// 覆盖左下角子棋盘
if (dr >= tr + s && dc < tc + s)
// 特殊方格在此棋盘中
chessBoard(tr+s, tc, dr, dc, s);
else {// 用 t 号L型骨牌覆盖右上角
board[tr + s][tc + s - 1] = t;
// 覆盖其余方格
chessBoard(tr+s,tc,tr+s,tc+s-1,s);}
// 覆盖右下角子棋盘
if (dr >= tr + s && dc >= tc + s)
// 特殊方格在此棋盘中
chessBoard(tr+s, tc+s, dr, dc, s);
else {// 用 t 号L型骨牌覆盖左上角
board[tr + s][tc + s] = t;
// 覆盖其余方格
chessBoard(tr+s,tc+s,tr+s,tc+s,s);}
}
int main()
{
//int t,n,u,w;
int x, y, k;
cin>>x>>y>>k;
chessBoard(0, 0, x, y, k*k);
for(int i = 0; i < k*k; i++)
{
for(int j = 0; j < k*k; j++)
{
cout<<board[i][j]<<' ';
if(board[i][j] < 10)
cout<<' ';
}
cout<<endl;
}
return 0;
}
//
汉诺塔
//汉诺塔
//
//输入:3
//输出:recusive:
//1 : A --> C
//2 : A --> B
//1 : C --> B
//3 : A --> C
//1 : B --> A
//2 : B --> C
//1 : A --> C
#include <iostream>
#include <string.h>
using namespace std;
void Hanoi(char src, char des, char via, int n)
{
if(n == 1)
{
cout << n <<" : "<< src <<" --> " <<des << endl;
return;
}
Hanoi(src, via, des, n - 1);
cout << n <<" : "<< src <<" --> " <<des << endl;
Hanoi(via, des, src, n - 1);
}
int main()
{
int n;
cin >> n;
cout<<"recusive:"<< endl;
Hanoi('A','C','B', n);
cout << endl;
return 0;
}
矩阵连乘
//样例输入:3 2 2 2
//样例输出:(A*(B*C))
#include<iostream>
#include<cstring>
using namespace std;
const int size=100;
int p[size];
int m[size][size],s[size][size];
int n;
void matrixchain()
{
int i,r,j,k;
memset(m,0,sizeof(m));
memset(s,0,sizeof(s));//初始化数组
for(r=2;r<=n;r++)//矩阵连乘的规模为r
{
for(i=1;i<=n-r+1;i++)
{
j=i+r-1;
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];//对m[][]开始赋值
s[i][j]=i;//s[][]存储各子问题的决策点
for(k=i+1;k<j;k++)//寻找最优值
{
int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(t < m[i][j])
{
m[i][j]=t;
s[i] [j]=k;
}
}
}
}
}
void print(int i,int j)
{
if(i == j)
{
cout<<"A["<<i<<"]";
return;
}
cout<<"(";
print(i,s[i][j]);
print(s[i][j]+1,j);//递归1到s[1][j]
cout<<")";
}
int main()
{
cout<<"请输入矩阵的个数n : "<<endl;
cin>>n;
int i,j;
cout<<"请依次输入每个矩阵的行数和最后一个矩阵的列数:"<<endl;
for(i=0;i<=n;i++)
cin>>p[i];
matrixchain();
print(1,n);
cout<<endl;
cout<<"最小计算量的值为:"<<m[1][n]<<endl;
return 0;
}
排列树
//排列树,
//这个代码输出的是“5678”的全排列
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
void printVector(vector<int> array );
int dfs(vector<int>& array, int t)
{
size_t size = array.size();
if(t == size)
printVector(array);
//dfs to the next level
for(int i = t; i < size; i++)
{
int j = i;
string s;
while(j --)
s += "\t" ;
//cout <<s << "================ start ==================================;; i =" <<i << endl;
swap(array[t],array[i]);
//cout <<s << "begin to swap " << array[i]<< " and " << array[t] <<endl; ;
//cout <<s << "call dfs -- lvevel " << t+1 <<endl;
dfs(array, t+1);
//cout <<s << "return dfs -- lvevel " << t+1 <<endl;
//cout <<s << "end to swap" << array[i]<< " and " << array[t] <<endl; ;
swap(array[i],array[t]);
//cout <<s << "================= end ==================================;; i =" <<i << endl;
}
}
void printVector(vector<int> array )
{
for(int i = 0; i <array.size(); i++)
cout << array[i]<< "\t" ;
cout << endl;
}
int main()
{
vector<int> b ;
#if 1
b.push_back(5);
b.push_back(6);
b.push_back(7);
b.push_back(8);
#else
b.push_back(4);
b.push_back(3);
b.push_back(2);
b.push_back(1);
b.push_back(0);
#endif
sort(b.begin(), b.end());
dfs(b, 0);
return 0;
}
//整数划分
//1.只能能够计算有多少种划分
//输入:6
//输出:11
#include <iostream>
using namespace std;
int func(int n, int m){
if(n == 1 || m == 1){
return 1;
}
else if(n < m){
return func(n,n);
}
else if (n == m) {
return func(n,m-1)+1;
}
else if(n >= m){
return func(n,m-1) + func(n-m,m);
}
}
int main(){
int n;
while(cin>>n){
cout<<func(n,n)<<endl;
}
return 0;
}
子集树
//样例输入:abc
// 3
//样例输出:c
// b
// bc
// a
// ac
// ab
// abc
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define MAX 10000
static int flag[MAX];
static char str[MAX];
using namespace std;
void print(int n)
{
for(int i = 0; i < n; i++)
{
if(flag[i])
{
printf("%c", str[i]);
}
}
printf("\n");
}
int tr(int t, int n)
{
if (t >= n)
{
print(n);
return 1;
}
flag[t] = 0;
tr(t+1, n);
flag[t] = 1;
tr(t+1, n);
}
int main()
{
int n = 0;
cout << "please input a string: " << endl;
cin >> str;
cout << "please input n: " << endl;
cin >> n;
tr(0, n);
return 0;
}
子集树(二)
//子集树,这个输出是01表示的
#include <stdio.h>
#include <string.h>
#define N 3
int x[N+1];
void Backtrace(int t)
{
if(t>N)
{
for(int i=1;i<=N;i++)
{
printf("%d ",x[i]);
}
printf("\n");
}
else
{
for(int i=0;i<=1;i++)
{
x[t]=i;
Backtrace(t+1);
}
}
}
int main()
{
memset(x,0,(N+1)*sizeof(int));
Backtrace(1);
}
最长公共子序列(一)
//样例输入:abcde
// bcd
//样例输出:3
//
//只能求出最长公共子序列的长度
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int MAXN = 1005;
int DP[MAXN][MAXN];
int main()
{
string a;
string b;
while(cin >> a >> b)
{
int l1 = a.size();
int l2 = b.size();
memset(DP, 0, sizeof(DP));
for(int i = 1; i <= l1; i++)
for(int j = 1; j <= l2; j++)
if(a[i - 1] == b[j - 1])
DP[i][j] = max(DP[i][j], DP[i - 1][j - 1] + 1);
else
DP[i][j] = max(DP[i][j - 1], DP[i - 1][j]);
printf("%d\n", DP[l1][l2]);
}
return 0;
}
最长公共子序列(二)
//样例输入:4
// bcdb
// 7
// abcbdab
//样例输出:
#include<iostream>
#include<cstring>
#define MAX_LEN 100
using namespace std;
/**
* @author zjq~
* @time 2017/07/08
* @func 动态规划求解最长公共子序列问题
*/
char x[MAX_LEN]; //两个子序列
char y[MAX_LEN];
int xLen=0; //两个子序列的长度
int yLen=0;
char z[MAX_LEN]; //保存最长公共子序列
int c[MAX_LEN][MAX_LEN]; //记录LCS[i][j] 的个数
void getLCS() {
//构造二维表
for(int i=0; i<=xLen; i++) {
for(int j=0; j<=yLen; j++) {
if(i==0||j==0) {
c[i][j]=0;
} else if(i>0&&&j>0&&x[i]==y[j]) {
c[i][j]=c[i-1][j-1]+1;
} else {
c[i][j]=c[i-1][j]>c[i][j-1]?c[i-1][j]:c[i][j-1];
}
}
}
int num=0;
int i=xLen;
int j=yLen;
//回溯获得最长子序列
while(i!=0&&j!=0){
if(c[i][j]!=c[i-1][j]){
z[++num]=x[i];
j--;
i--;
while(c[i][j]==c[i][j-1]) j--;
}else{
i--;
}
}
}
int main() {
cin>>xLen; //下标从 i=1 开始
for(int i=1; i<=xLen; i++) {
cin>>x[i];
}
cin>>yLen;
for(int i=1; i<=yLen; i++) {
cin>>y[i];
}
getLCS(); //获得最长公共子序列
cout<<"最长公共子序列包含元素个数为:"<<c[xLen][yLen]<<endl;
cout<<"最长公共子序列为:";
for(int i=c[xLen][yLen];i>0;i--){
cout<<z[i]<<" ";
}
cout<<endl;
}