写的一个递归程序 出问题了
大致的是 给定 1 2 3 4 到n 的序列
求出所有的合法的出站序列
准备用递归写
a 表示 初始站 b 是中间的那个中转站 c 是终点
foo(m,n) //表示 a 和 b 中元素的个数
有两种转移方式 --》foo(m,n-1)
--> foo(m-1,n+1)
但是我一直不太会控制 这个递归程序,貌似数据会有污染
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <stack>#include <iostream>using namespace std;const int N = 1000;int a[N],d[N];stack<int> b,c;int M;//void cp(stack<int> &src ,)void foo(int n,int m){ int tmp = 0; if(m < 0 || n <0 ) return ; if(m == 0 && n ==0) { int i = 1; while(!c.empty() ) { tmp = c.top(); c.pop(); d[i++] = tmp; } for(i = M ; i > 0 ; i --) { printf("%d%c",d[i],(i==1)?'\n':' '); c.push(d[i]); //恢复栈C 的内容 } } if(n > 0) { tmp = a[n]; b.push(tmp); foo(n-1,m+1); b.pop(); } if( m >0 && !b.empty()) { tmp = b.top(); b.pop(); c.push(tmp); foo(n,m-1); c.pop(); }}int main(){ M = 4; for(int i = 1 ; i <= M ; i ++) a[i] = i; foo(M,0); return 0;}const int N = 1000;int a[N],d[N];stack<int> b,c;int M;void foo(int n,int m){ int tmp = 0; if(m < 0 || n <0 ) return ; if(m == 0 && n ==0) { int i = 1; while(!c.empty() ) { tmp = c.top(); c.pop(); d[i++] = tmp; } for(i = M ; i > 0 ; i --) { printf("%d%c",d[i],(i==1)?'\n':' '); c.push(d[i]); //恢复栈C 的内容 } } if(n > 0) { tmp = a[n]; b.push(tmp); foo(n-1,m+1); a[n] = b.top(); //这里增加一句,需要再次把数据复原,以便下次使用 b.pop(); } if( m >0 && !b.empty()) { tmp = b.top(); b.pop(); c.push(tmp); foo(n,m-1); b.push(c.top()); //相应的,这里添加一句 c.pop(); }}int main(){ M = 4; for(int i = 1 ; i <= M ; i ++) a[i] = i; foo(M,0); return 0;}