您的位置:首页 > 其它

递归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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  递归