题目描述
有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况:
○○○○○●●●●●
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:
○●○●○●○●○●
任务:编程打印出移动过程。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
void movechess(int n)
{
if(n==4)
{
printf("4,5-->9,10\n");
printf("8,9-->4,5\n");
printf("2,3-->8,9\n");
printf("7,8-->2,3\n");
printf("1,2-->7,8\n");
return ;
}
printf("%d,%d-->%d,%d\n",n,n+1,2*n+1,2*n+2);
printf("%d,%d-->%d,%d\n",2*n-1,2*n,n,n+1);
movechess(n-1);
}
int main()
{
int n;
while(cin>>n)
{
movechess(n);
}
return 0;
}
//如果允许相邻的棋子之间交换位置,最后形成黑白相间的排列,求最少需要移动的步数N
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int dp[1000+10]={0};
int main()
{
for(int i=1; i<=1000; i++)
dp[i]=dp[i-1]+i-1;
int n;
while(cin>>n)
printf("%d\n",dp[n]);
return 0;
}