计算机算法分析与设计实验报告
实验一:递归回溯
-
阶乘(Factorial)
#include<iostream> using namespace std; int factorial(int n) { if (n==1) { return 1; } else{ return n*factorial(n-1); } } int main() { cout<<"求阶乘"<<endl; cout<<"请输入一个整数n"<<endl<<"n="; int n; cin>>n; cout<<"n的阶乘为"; cout<<factorial(n); return 0; } -
斐波那契数列(Fibonacci)
#include<iostream> using namespace std; int fibonacci(int n) { if (n==0||n==1) { return 1; } else { return fibonacci(n-1)+fibonacci(n-2); } } int main() { cout<<"斐波那契数列"<<endl; int n; cout<<"请输入一个整数n,表示要查询斐波那的第n位(起始位为第0位)"<<endl<<"n="; cin>>n; cout<<"第n位为"; cout<<fibonacci(n); return 0; } -
汉诺塔(Hanoi)
#include<bits/stdc++.h> using namespace std; int sum=0; int hanoi(int n) { if (n==1) { sum++; } else{ hanoi(n-1); sum++; hanoi(n-1); } return sum; } int main() { cout<<"Hanoi"<<endl; int n; cin>>n; cout<<hanoi(n); return 0; } -
整数分解(Integer)
#include<bits/stdc++.h> using namespace std; int res_num; int res[100]; int p_res=0; void integer(int n) { if (n<=0) { for (int i=0; i<p_res; i++) cout<<res[i]<<" "; cout<<endl; res_num++; } for (int i=1; i<=n; i++) { res[p_res]=i; p_res++; integer(n-i); p_res--; } } int main() { cout<<"数字拆分"<<endl; int n; cout<<"请输入需要拆分的数字"<<endl; cin>>n; cout<<"拆分结果如下:"<<endl; integer(n); cout<<"共计"; cout<<""<<res_num<<"种"<<endl; res_num=0; return 0; } -
整数全排列(Perm)
#include<bits/stdc++.h> using namespace std; inline void Swap(int &a,int &b) { int temp=a; a=b; b=temp; } void Perm(int list[],int k,int m) { if(k==m) { for(int i=0;i<=m;i++) { cout<<list[i]<<" "; } cout<<endl; } else{ for (int i=k;i<=m;i++) { Swap(list[k],list[i]); Perm(list,k+1,m); Swap(list[k],list[i]); } } } int main() { cout<<"全排列"<<endl; int n; int list[15]; cout<<"请输入一个不大于10的数"<<endl; cin>>n; cout<<"请依次输入"<<n<<"个数字"<<endl; for (int i=0;i<n;i++) cin>>list[i]; cout<<"全排列为"<<endl; Perm(list,0,n-1); return 0; }
实验二:排序
-
MergeSort
#include <iostream> #include <ctime> #include <cstdlib> #include <vector> using namespace std; void Merge(vector<int> &A, int p, int q, int r) { vector<int>::iterator iter = A.begin(); vector<int> L(iter + p, iter + q + 1); vector<int> R(iter + q + 1, iter + r + 1); int i = 0, j = 0; while (i < L.size() && j < R.size()) { if (L[i] < R[j]) A[p++] = L[i++]; else A[p++] = R[j++]; } if (i == L.size()) { while (j < R.size()) A[p++] = R[j++]; } else { while (i < L.size()) A[p++] = L[i++]; } } void MergeSort(vector<int> &A, int p, int r) { if (p < r) { int q = (p + r) / 2; MergeSort(A, p, q); MergeSort(A, q + 1, r); Merge(A, p, q, r); } } int main() { srand((unsigned)time(NULL)); int times = rand() % 20 + 10; cout << "排序组成元素个数: "<<times<<endl; vector<int> A(times, 0); cout << "所排列元素:"<<endl; for (int i = 0; i < times; i++) { A[i]=rand() % 20; cout<<A[i]<<" "; } cout<<endl; MergeSort(A, 0, times - 1); cout << "所排序结果为:" << endl; for (int i = 0; i < A.size(); i++) cout << A[i] << " "; cout << endl; return 0; } -
QuickSort
#include <bits/stdc++.h> using namespace std; void QuickSort(int *arr, int left, int right) { if (left > right) return; int i = left, j = right; int flag = arr[left]; while (i != j) { while (arr[j] > flag && i < j) j--; while (arr[i] <= flag && i < j) i++; if (i < j) swap(arr[i], arr[j]); } arr[left] = arr[i]; arr[i] = flag; QuickSort(arr, left, i - 1); QuickSort(arr, i + 1, right); } int main() { srand((unsigned)time(NULL)); int times = rand() % 20 + 10; cout << "排序组成元素个数: " << times << endl; int array[times]; cout<<"排序的数组:"<<endl; for (int i = 0; i < times; i++) { array[i] = rand() % 20; cout<<array[i]<<" "; } cout<<endl; QuickSort(array, 0, times - 1); cout<<"排序结果:"<<endl; for (int i = 0; i < times; i++) cout << array[i] << ' '; return 0; }
实验三:最长公共子序列&凸多边形最优三角剖分
-
最长公共子序列
#include<bits/stdc++.h> using namespace std; void LCS(string s1,string s2); int main() { string s1,s2; cout<<"请输入第一个字符串"<<endl; cin>>s1; cout<<"请输入第二个字符串"<<endl; cin>>s2; LCS(s1,s2); return 0; } void LCS(string s1,string s2) { int m=s1.length()+1,n=s2.length()+1; int **c,**b; c=new int* [m],b=new int* [m]; for(int i=0; i<m; i++) { c[i]=new int [n]; b[i]=new int [n]; for (int j=0; j<n; j++) b[i][j]=0; } for(int i=0; i<m; i++) c[i][0]=0; for(int i=0; i<n; i++) c[0][i]=0; for (int i=0; i<m-1; i++) { for(int j=0; j<n-1; j++) { if(s1[i]==s2[j]) { c[i+1][j+1]=c[i][j]+1; b[i+1][j+1]=1; } else if(c[i][j+1]>=c[i+1][j]) { c[i+1][j+1]=c[i][j+1]; b[i+1][j+1]=2; } else { c[i+1][j+1]=c[i+1][j]; b[i+1][j+1]=3; } } } stack<char> same; stack<int> same1,same2; for (int i=m-1,j=n-1; i>=0&&j>=0;) { if(b[i][j]==1) { i--,j--; same.push(s1[i]); same1.push(i),same2.push(j); } else if(b[i][j]==2) i--; else j--; } cout<<endl<<"最长公共子序列为:"<<endl; while(!same.empty()) { cout<<same.top(); same.pop(); } } -
凸多边形最优三角剖分
#include<bits/stdc++.h> using namespace std; const int M=1111; int n; int s[M][M]; double t[M][M],weight[M][M]; void MinWeightTriangulation() { for(int i=1; i<=n; i++) t[i][i]=0,s[i][i]=0; for(int r=2; r<=n; r++) { for(int i=1; i<=n-r+1; i++) { int j=i+r-1; t[i][j]=t[i+1][j]+weight[i-1][i]+weight[i][j]+weight[i-1][j]; s[i][j]=1; for(int k=i+1; k<j; k++) { double u=t[i][k]+t[k+1][j]+weight[i-1][k]+weight[k][j]+weight[i-1][j]; if(t[i][j]>u) t[i][j]=u,s[i][j]=k; } } } } void Traceback(int i,int j) { if(i==j) return ; Traceback(i,s[i][j]); Traceback(s[i][j]+1,j); cout<<"三角划分顶点:V"<<i-1<<",V"<<j<<",V"<<s[i][j]<<endl; } int main() { int i,j; cout<<"请输入顶点的个数n:"<<endl; cout<<"n="; cin>>n; n--; cout<<"请依次输入权值"<<endl; for(i=0; i<=n; i++) for(j=0; j<=n; j++) cin>>weight[i][j]; MinWeightTriangulation(); cout<<endl<<"最优三角形的权值和为"<<t[1][n]<<endl; cout<<"三角形划分顶点为:"<<endl; Traceback(1,n); return 0; }
1873

被折叠的 条评论
为什么被折叠?



