该文章是算法设计与分析(第二版)中各章的课后习题 主编 : 李春葆
在本文中,主要是对该书第二章-递归算法设计技术章节中的在线编程题进行代码解答。
代码运行环境是: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;
}
运行截图: