算法设计与分析第二章(递归算法) 课后习题答案(c++)

该文章是算法设计与分析(第二版)中各章的课后习题 主编 : 李春葆

在本文中,主要是对该书第二章-递归算法设计技术章节中的在线编程题进行代码解答。

代码运行环境是:DEVc++

问题一:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iomanip>
using namespace std;
int num = 1;
void luox(int n,vector<vector<int>>& a,int left,int right,int top,int bottom){
    if(left <= right && top <= bottom){
        for(int i = left ; i <= right;i++){
            a[top][i] = num;
            num++;
        }
        for(int i = top + 1 ; i <= bottom;i++){
            a[i][right] = num;
            num++;
        }
        
        for(int i = right - 1 ; i >= left ;i--){
            a[bottom][i] = num;
            num++;
        }
        for(int i = bottom - 1 ; i > top;i--){
            a[i][left] = num;
            num++;
        }
    }
        
    if(num > n*n){
        return;
    }
    //递归 
    luox(n,a,left+1,right-1,top+1,bottom-1);
}

//打印矩阵 
void prt(vector<vector<int>>& a){
    int len = a.size();
    for(int i = 0 ; i < len ;i++){
        for(int j = 0 ; j < len ;j++){
            cout<<setw(5)<<a[i][j] <<" ";
        }
        
        cout<<endl;
    }
}
int main(){
    int n ; 
    cout <<"请输入一个正整数n(1<= n <= 50):"<<endl;
    cin>>n;
    vector<vector<int>> a(n, vector<int>(n));
    int left = 0, right = n - 1, top = 0, bottom = n - 1;
    
    luox(n,a,left,right,top,bottom);
    cout<<"结果为:" <<endl;
    prt(a);
    return 0;
}

运行截图:

问题二:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int ansow = 0;
int tobi(int n ){
    int y = 0;
     for (int j = 0; j < 50; j++){
         if(n == 0){
             break;
        }
        y += n%2;    //取2的余数
        n = n/2;    //取被2整除的结果
    }
//    cout<<"y = "<<y;
    return y;
}
int sumt(int n){
    int x = 0; 
    while(n){
        x += n % 10;
        n /= 10;
    }
//    cout<<"x = "<<x<<endl;
    return x;
}

int lucky(int n){
    if(n == 0){    
        return  ansow;
    }
    if(tobi(n) == sumt(n)){
        ansow ++;
    }
    lucky(n-1);
        
//循环解法    
//    while(n){
//        int x = 0,y = 0;
//        
//        y = tobi(n,bi);
//        x = sumt(n);
//        cout<<endl;
//        if(x == y){
//            cout<<"n = "<< n <<endl;
//            ansow++;
//        }
//        bi.clear();
//        n--;
//    }
//    return ansow;
}
int main(){
    int n;
    //vector<int> bi(50);
    cout<<"请输入一个数:"<<endl;
    cin>>n;

    ansow = lucky(n);
    cout <<"ansow = "<<ansow;
    return 0;
}

运行截图:

问题三:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int k = 0;
int    trance(int a[],int j,int len){
    //递归出口 
    if(j == len-1 || j == len){
        if(a[j] != a[len]){
            return -1;
        }
        return k;
    }
    
    if(a[j] < a[len]){
        a[j+1] += a[j];
        //cout<<a[j+1]<<endl;
        a[j] = 0;
        k++;
        trance(a,j+1,len);
    }else if(a[j] > a[len]){
        a[len - 1] += a[len]; 
        //cout<<a[len-1]<<endl;;
        a[len] = 0;
        trance(a,j,len-1);
        k++;
    }else{
        trance(a,j+1,len-1);
    }
}
int main(){
    int a[50] = {1,1,1,3};
    int len = 0;
    for(int i = 0 ; i < 50 ;i++){
        if(a[i] != 0){
            cout<<a[i]<<" ";
            len++;
        }else{
            break;
        }
    }
    cout<<endl;
    int time = trance(a,0,len-1);
    if(time == -1){
        cout<<"该数组不能转换成回文序列:"<<endl;
    } else{
        cout<<"需要转换 "<<time<<" 次"<<endl;
    }
    return 0;
}

运行截图:

问题四:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int Tim(int n){
    int sum = 0;
    if(n == 1){
        return 1;
    }else{
        for(int i = 1;i < n ; i++){
            //先走i个距离,再一次性走 n-i 个距离 
            sum += Tim(i); 
        }
        //一次性走n个距离 
        sum += 1;
    }
    return sum;
}
int main(){
    int n;
    while(1){
        cout<<"请输入一个数(1-6):"<<endl;
        cin>>n;
        if(n < 1 || n > 6){
            cout<<"输入错误,请重新输入:"<<endl;
        }else{
            break;
        }
    }
    cout<<"总共有 "<<Tim(n)<<" 种走法"<<endl;
    return 0;
}

运行截图:

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值