问题 A: 【递归】棋子移动---------------递归

本文探讨了一种棋子移动游戏的算法解决方案,目标是在2N个棋子中实现黑白相间的排列。通过递归方法,文章详细解释了如何从初始状态开始,经过一系列规定步骤,最终达到目标状态。特别关注于当N大于4时的处理策略。
摘要由CSDN通过智能技术生成

题目描述

魔法世界的历史上曾经出现过一位赫赫有名的不败战神陈庆之,陈庆之以棋道悟兵法,一生身经数百战,没有一场败绩,而且没有一场不是在绝对的劣势中大胜敌军。

受此影响,魔法世界开始流行一种叫棋子移动的游戏,即有2N个棋子(N≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,例如当N=4时,棋子排列情况为:

〇〇〇〇●●●●

移动棋子的规则是:每次必须同时移动相邻两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置.每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。例如当N=4时,最终排列情况为:

〇●〇●〇●〇●

试求出移动步骤。
输入
一个整数,即N。
输出
输出移动步骤,每一步操作占一行。
样例输入 Copy
4
样例输出 Copy
4,5–>9,10
8,9–>4,5
2,3–>8,9
7,8–>2,3
1,2–>7,8

解析:
找规律题
根据样例可以发现4,5(n,n+1).9,10(2n+1,2n+2); 第二行的右边第一行的左边。第二 行的 左边第一行右边都-1.

当n>4时我们尽量让n递归到4。

每当n>4的时候就会多出来两行。

n==5的情况
5
5,6-->11,12
9,10-->5,6
4,5-->9,10
8,9-->4,5
2,3-->8,9
7,8-->2,3
1,2-->7,8

#include<bits/stdc++.h>
using namespace std;
int n; 
int k;
void mv(int j)
{
	printf("%d,%d-->%d,%d\n",j,j+1,k,k+1);
	k=j;
}
void dfs(int n)
{
	if(n==4)
	{
		mv(4);mv(8);mv(2);mv(7);mv(1);
	}
	else
	{
		mv(n);mv(2*n-1);dfs(n-1);
	}
}
int main()
{
	cin>> n;
	k=2*n+1;
	dfs(n);
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值