算法代码rar

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;

}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值