递归7_旗子的移动问题
2016-03-31 17:23
162 查看
static int count = 1; @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. chessAction(4); } /** 问题描述:有2n个棋子排成一行,白子用0代表,黑子用1代表。n=5的状态为: 0000011111_ _ (右边至少两个空位) 移动规则: (1)每次必须移动相邻的两个棋子,这两个棋子不能互换位置 (2)移动的颜色不限,移动的方向不限 要求: 最后成为 _ _ 0101010101 的状态(中间无空格)。 */ void chessAction(int n) { if (n < 4) { return; }else if(n == 4) { //递归结束的 //当递归到规模为4 的时候 // 00001111__ // 0123456789 //1:000__11101 printf("第%d步:%d&%d和空格(%d&%d)交换\n",count++,3,4,8,9); //2:0001011__1 printf("第%d步:%d&%d和空格(%d&%d)交换\n",count++,7,8,3,4); //3:0__1011001 printf("第%d步:%d&%d和空格(%d&%d)交换\n",count++,1,2,7,8); //4:010101__01 printf("第%d步:%d&%d和空格(%d&%d)交换\n",count++,6,7,1,2); //5:__01010101 printf("第%d步:%d&%d和空格(%d&%d)交换\n",count++,0,1,6,7); }else { //开始递归 //把规模为n 的问题 转化成 规模为 n-1 的问题 //1.把 第n-1 和 n 和空格(2n,2n+1)交换 printf("第%d步:%d&%d和空格(%d&%d)交换\n",count++,n-1,n,2*n,2*n+1); //2.把 第2n-2 和 2n-2和空格(n-1,n)交换 printf("第%d步:%d&%d和空格(%d&%d)交换\n",count++,2*n-2,2*n-2,n-1,n); //经过上步操作变成了问题为n-1 的规模 chessAction(n-1); } } @end
相关文章推荐
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- java递归菜单树转换成pojo对象
- 一个JavaScript递归实现反转数组字符串的实例
- Java中的递归详解(用递归实现99乘法表来讲解)
- C语言的递归思想实例分析