写了个递归的,  又学到了不少 九九同学的交换宏  xzlxzlxzl同学的不要轻易使用全局变量和在函数里定义静态变量
程序代码:
	
	
			
程序代码:#include<stdio.h>
#include<string.h>
#define SWAP(x,y,n,a){char temp=0;temp=str[x];str[x]=str[y];str[y]=temp;n++;printf("%d:%s\n",n,a);}//定义交换宏
char t;
int n=0;
char str[11]="wrbbrwwrbr";
int fun(char str[], int b, int w, int r)
{
    int i;
    if(w == r)     //如果过w和r索引下标相等,结束 
    {
        return 0;
    }
    
    for(i = 0; i < r-1; i++)   
    {
        if(str[w+i] == 'b' && (str[b]=='b'))   //如果(w)找到的蓝色和准备要交换的(b)位置上(蓝色)一样 
        {
            fun(str, b+1, w, r);              //b的下标加1 
            break;
        }
        
        else if(str[w+i]=='r' && (str[r] == 'r')) //如果(w)找到的红色和准备要交换的(r)位置上(红色)一样 
        {
            fun(str,b,w,r-1);                   //r的下标加1 
            break;
        }
        
        else if(str[w+i] == 'b')            //如果找到蓝色了 
        {
             SWAP(w+i,b,n,str);            //交换 
             fun(str,b+1,w+1,r);          //b, w下标加1 
             break;
        }
        
        else if(str[w+i] == 'r')         //如果找到红色了 
        {
            SWAP(w+i,r,n,str);          //交换 
            fun(str, b, w+1, r-1);       //w加1, r减1 
            break;
        }
    
        else if(str[w+i] == 'w')      //如果找到白色 
        {
            fun(str,b,w+1,r);      //w加1 
            break;
        }
    }
}
int main(void)
{
    int b=0, w=0, r=strlen(str)-1;
    fun(str, b, w, r);
    
    printf("%d:%s",n+1, str);
    
    return 0;
}										
					
	
早知做人那么辛苦! 当初不应该下凡

											

	    
看来有时间九九还是要根进一下才行~还有感觉炎版主的递归写法较为清晰易懂~赞一个~										
					
	
											
个人感觉,你这样练习算法是教条、走形式,作用不大。
你...这思维太跳跃了吧!和组合相关吗?即使相关,你想想,最终完成汉诺塔的移动其实只有唯一的一种路径,要从几亿的排列组合中筛选出唯一的那条路径,是不是太笨了?