1203:扩号匹配问题;1204:爬楼梯 1205:汉诺塔问题;

 1203:扩号匹配问题

#include
using namespace std;
const int maxn=105;
int Left[maxn],Right[maxn];
char str[maxn],ans[maxn];
int stk[maxn];
int main(){	
	while(cin>>str){
		int p=0,q=0;
		int head=-1;//栈空
		memset(Left,0,sizeof(Left));
		memset(Right,0,sizeof(Right));
		memset(ans,0,sizeof(ans));
		cout<

1204:爬楼梯 

#include
using namespace std;
int f(int n){
	if(n==1) return 1;
	else if(n==2) return 2;
	return f(n-1)+f(n-2);
}
int main(){
	int n;
	while(cin>>n){
		cout<

 1205:汉诺塔问题

思路:

首先,根据举例演示,我们可以将3片从源柱利用过渡柱移动到目标柱上去。而且这个方法具有一般性的规律,所以我们可以将任意n片移动到指定位置。(3片的时候可以这样挪动,那4片的时候就可以先挪动好3片,再挪动第4片,推广到任意n片)

下面的思路也不错:

把放盘子看成三个步骤,以c为中转点,要把所有盘子放进b里:

1.把n-1个盘子从a放到c上

2.最大的那个盘子放到b上

3.把n-1个盘子从c放到b上

所以这就是递归函数的三个步骤。首先要知道结束递归的条件,n=1时,把这个最小的盘子放在从a直接放进b,这是最后一步。

虽然在递归时变量名在不停交换(一下abc一下acb一下cab的)容易搞混(嗯我就被搞混了),但是要记得一点,函数的作用:输入进函数的三个字母参数,是把第一个字母上的盘子放进第三个字母上的盘子,每调用一次就会判断一次n是否等于1,不是就继续调用,是就输出,一直到最终结束递归的条件。这样就不会被绕晕了~

 

具体实现:

#include 

using namespace std;

void hano(int n,char a,char c,char b)    //这是汉诺塔的递归函数,以传进来的变量c为中转点,把n个盘子放到b上
{
    if(n==1)    //当n=1时,直接把这个盘子从a放到b上
    {
        printf("%c->%d->%c\n",a,n,b);
    }
    else   //否则
    {
        hano(n-1,a,b,c);    //把n-1个盘子从a放到c上
        printf("%c->%d->%c\n",a,n,b);  //最大的那个盘子放到b上
        hano(n-1,c,a,b);  //把n-1个盘子从c放到b上
    }
}

int main()
{
   int n;
   char a,b,c;
   cin>>n>>a>>b>>c;
   hano(n,a,c,b);
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(ACM算法)