黑白棋子移动

问题 F: 黑白棋子移动

时间限制: 1 Sec   内存限制: 128 MB

题目描述


2n个棋子( n4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值