Liny_@NotePad

沉迷ACG中

设计一个递归算法求解汉诺塔问题

  算了好久 囧

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. void move(int n, int x, int y){
  5.         static int t = 1;
  6.         cout<<"第"<<t++<<"步 "<<char(x+64)<<"(第"<<n<<"号盘子) -> "<<char(y+64)<<endl;
  7. }
  8.  
  9. void hanoi(int n,int a, int b, int c){
  10.         if(n==1)
  11.                 move(1,a,c);
  12.         else{
  13.                 hanoi(n-1,a,c,b);
  14.                 move(n,a,c);
  15.                 hanoi(n-1,b,a,c);
  16.         }
  17. }
  18.  
  19. int main(){
  20.         int n;
  21.  
  22.         cout<<"请输入第一根柱子上的盘子数:";
  23.         cin>>n;
  24.  
  25.         hanoi(n,1,2,3);
  26.  
  27.         return 0;
  28. }

 

用递归算法重新设计选择排序算法

不知道是不是这样写 囧?

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. #define N 100
  5.  
  6. void sort(int A[], int n){
  7.         if(n==1)return;
  8.         for(int i=0; i<n-1; i++){
  9.                 if(A[i]>A[n-1]){
  10.                         int t = A[i];
  11.                         A[i] = A[n-1];
  12.                         A[n-1] = t;
  13.                 }
  14.         }
  15.         sort(A,n-1);
  16. }
  17.  
  18. void print(int A[], int n){
  19.         for(int i=0; i<n; i++){
  20.                 cout<<A[i]<<" ";
  21.         }
  22.         cout<<endl;
  23. }
  24.  
  25. int main(){
  26.         int A[N], n;
  27.  
  28. input:
  29.         cout<<"请输入数组的长度(<"<<N<<"):";
  30.         cin>>n;
  31.  
  32.         if(n<=0){
  33.                 cout<<"n必须大于0!"<<endl;
  34.                 goto input;
  35.         }
  36.         if(n>=N){
  37.                 cout<<"n必须小于"<<N<<"!"<<endl;
  38.                 goto input;
  39.         }
  40.  
  41.         cout<<"请输入数组的元素:";
  42.         for(int i=0; i<n; i++){
  43.                 cin>>A[i];
  44.         }
  45.  
  46.         cout<<"排序前的数组:";
  47.         print(A,n);
  48.  
  49.         sort(A,n);
  50.  
  51.         cout<<"排序后的数组:";
  52.         print(A,n);
  53.  
  54.         return 0;
  55. }

用递归算法求解f(x)=x-x^3/3!+x^5/5!-x^7/7!+...

用递归算法求解如下问题,计算到第n项为止:
f(x)=x-$\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+...

用递归算法求解f(x)=x/2+x^2/4+...+x^n/2^n

用递归算法求解如下问题:

f(x)=$\frac{x}{2}$$+\frac{x^2}{4}+...+\frac{x^n}{2^n}

设计一个递归算法计算Fibonacci数列

囧 好久没写算法了……

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int getFibonacci(int n){
  5.         if(n==0||n==1)return 1;
  6.         return getFibonacci(n-1)+getFibonacci(n-2);
  7. }
  8.  
  9. int main(){
  10.         int n;
  11.        
  12.         while(true){
  13.                 cout<<"请输入要求的Fibonacci数列项数(输入-1退出):";
  14.                 cin>>n;
  15.                 if(n<0)break;
  16.  
  17.                 cout<<"第"<<n<<"项是:";
  18.                 cout<<getFibonacci(n)<<endl;
  19.         }
  20.  
  21.         return 0;
  22. }

【模板】Prim - 最小生成树

  我最常用的最小生成树算法 = 3=

  1. #define N 505
  2. #define MAX 65540
  3.  
  4. int n;
  5. int edge[N][N];
  6. int sum;
  7.  
  8. void prim(){
  9. int i,j,k;
  10.                 int lowcost[N];
  11.                 bool visit[N]={false};
  12.                 sum = 0;
  13.                 for (i=0;i<n;i++){
  14.                         lowcost[i]=edge[0][i];
  15.                 }
  16.                 visit[0]=true;
  17.                 for (i=1;i<n;i++){
  18.                         j=0;
  19.                         while(visit[j]) j++;
  20.                         for (k=0;k<n;k++)
  21.                                 if((!visit[k])&&(lowcost[k]<lowcost[j])) j=k;
  22.                         sum = lowcost[j]>sum?lowcost[j]:sum;
  23.                         visit[j]=true;
  24.                         for (k=0;k<n;k++)
  25.                                 if (!visit[k]&&(edge[j][k]<lowcost[k])){
  26.                                         lowcost[k]=edge[j][k];
  27.                                 }
  28.                 }
  29. }

没连通的边长应为MAX。
求最大生成树时为0,修改两个小于号即可。

结点是从0到N。

【模板】SPFA - 单源最短路径

 看了wekooo给的某论文,从里面pascal翻过来 = =

  1. void SPFA(int s){
  2.     for(int i=1;i<=n;i++){
  3.         d[i] = MAX;
  4.     }
  5.         int queue[N*N] = {0};
  6.         bool visit[N] = {false};
  7.     int front = 0, rear = 1;
  8.         //int path[N];
  9.     queue[front] = s; visit[s] = true;  d[s] = 0;
  10.     while(front<rear){   
  11.         int u = queue[front];
  12.         visit[u] = false;
  13.         for(int i=1; i<=n; i++){
  14.             if (d[i]>d[u]+ edges[u][i]){
  15.                 d[i]= d[u]+edges[u][i];
  16.                 //path[i] = u;
  17.                 if( !visit[i] ){
  18.                     visit[i] = true;
  19.                     queue[rear++] = i;
  20.                 }
  21.             }
  22.                 }
  23.                 front++;
  24.     }
  25. }

调用时,初始结点s,目标结点e,则
SPFA(s);
cout<<d[e]<<endl;
即可。

注意结点是从1存储到N。
不能连通时值为MAX。

【模板】Dijkstra - 单源最短路径

  当年整理得 - -

  1. #define N 1002
  2. #define MAX 99999
  3. int edges[N][N],d[N],n;
  4.  
  5. void dijkstra(int v)
  6. {
  7.         int i,j;
  8.         bool s[N]={false};
  9.         for(i=1;i<=n;i++)
  10.                 d[i]=edges[v][i];
  11.         d[v]=0;s[v]=true;
  12.         for(i=1;i<n;i++)
  13.         {
  14.                 int temp=MAX;
  15.                 int u=v;
  16.                 for(j=1;j<=n;j++)
  17.                         if((!s[j])&&(d[j]<temp))
  18.                         {
  19.                                 u=j;
  20.                                 temp=d[j];
  21.                         }
  22.                         s[u]=true;
  23.                         for(j=1;j<=n;j++)
  24.                                 if((!s[j])&&(edges[u][j]<MAX)&&(d[u]+edges[u][j])<d[j])
  25.                                         d[j]=d[u]+edges[u][j];
  26.         }
  27.  
  28. }

调用时,初始结点s,目标结点e,则
dijkstra(s);
cout<<d[e]<<endl;
即可。

注意结点是从1存储到N。
不能连通时值为MAX。