题目:http://lx.lanqiao.org/problem.page?gpid=T303
代码:
#include <stdio.h> int FangAn(int m,int n); int main(int argc, const char * argv[]) { int m=0,n=0,s=0; scanf("%d%d",&m,&n); s=FangAn(m, n); printf("%d\n",s); return 0; } int FangAn(int m,int n) { if (m<n) { return 0; } if (n==0) { return 1; } return FangAn(m-1, n)+FangAn(m, n-1); }
这是一种类似汉诺塔问题的题目,首先要保证换鞋的人m 多于借鞋的人n。否则,无论怎么排序,都是会出现无鞋可借的尴尬局面。
所以,首先判断(m>n),否则返回0,表示没有方法来排序。
之后,当还鞋的人数n为0 的时候,这时候无论怎么排序都是一种方法,所以这时候函数返回的是1;
这里的return fun(m-1,n)+fun(m,n-1) 前面的fun(m-1,n)意思是还鞋子的一个人站在最前面,之后剩下的哪些人再接着排序,fun(m,n-1) 意思是借鞋子的人站在最后面,剩下的再接着排序。
FangAn(3,2)=*FangAn(2,2)+FangAn(3,1)*
=*FangAn(1,2)+FangAn(2,1)*+*FangAn(2,1)+FangAn(3,0)*
=*0*+*FangAn(1,1)+FangAn(2,0)*+*FangAn(1,1)+FangAn(2,0)*+*1*
=*0*+*FangAn(0,1)+FangAn(1,0)*+*1*+*FangAn(0,1)+FangAn(1,0)*+*1*+*1*
=0+0+1+1+0+1+1+1
=5