问题 F: 黑白棋子移动
时间限制: 1 Sec 内存限制: 128 MB题目描述
有
2n个棋子(
n≥
4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为
n=5的情形:
○○○○○●●●●●
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:
○●○●○●○●○●
任务:编程打印出移动过程。
输入
输入一行n
输出
移动过程
样例输入
7
样例输出
step 0:ooooooo*******--
step 1:oooooo--******o*
step 2:oooooo******--o*
step 3:ooooo--*****o*o*
step 4:ooooo*****--o*o*
step 5:oooo--****o*o*o*
step 6:oooo****--o*o*o*
step 7:ooo--***o*o*o*o*
step 8:ooo*o**--*o*o*o*
step 9:o--*o**oo*o*o*o*
step10:o*o*o*--o*o*o*o*
step11:--o*o*o*o*o*o*o*
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<cstdlib>
using namespace std;
int n;
int s;
void move(int k)
{
cout<<"step";
printf("%2d",s);
cout<<":";
s++;
for(int i=1;i<=k;i++)
cout<<'o';
for(int i=1;i<=k;i++)
cout<<'*';
cout<<"--";
for(int i=2*n-2*k;i>0;i-=2)
cout<<"o*";
cout<<endl;
cout<<"step";
printf("%2d",s);
cout<<":";
s++;
int p=2*k;
for(int i=1;i<k;i++)
{
cout<<'o';
}
cout<<"--";
for(int i=k+2;i<=k+k;i++)
cout<<'*';
cout<<"o*";
for(int i=2*n-2*k;i>0;i-=2)/!!!!!!!!!!!<=
{
cout<<"o*";
}
//cout<<" "<<k<<endl;
cout<<endl;
}
void mv(int k)
{
if(k>=8)
{
move(k/2);mv(k-2);
}
if(k==8)
{
cout<<"step";printf("%2d",s);cout<<":";s++;
cout<<"ooo*o**--*";
for(int i=2*n-8;i>0;i-=2)/!!!!!!!!!!!<=
{cout<<"o*";}
cout<<endl;
cout<<"step";printf("%2d",s);cout<<":";s++;
cout<<"o--*o**oo*";
for(int i=2*n-8;i>0;i-=2)/!!!!!!!!!!!<=
{cout<<"o*";}
cout<<endl;
cout<<"step";printf("%2d",s);cout<<":";s++;
cout<<"o*o*o*--o*";
for(int i=2*n-8;i>0;i-=2)/!!!!!!!!!!!<=
{cout<<"o*";}
cout<<endl;
cout<<"step";printf("%2d",s);cout<<":";s++;
cout<<"--o*o*o*o*";
for(int i=2*n-8;i>0;i-=2)/!!!!!!!!!!!<=
{cout<<"o*";}
cout<<endl;
//o*o*o*o*
//move2(9);move()
return;
}
}
int main()
{
//freopen("in.txt","r",stdin);
cin>>n;
mv(2*n);
//mem();
//cout<<o;
//while(1);
return 0;
}