• 黑白棋子的移动


    描述

     

    有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形:

    ○○○○○●●●●●

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

    ○●○●○●○●○●

    任务:编程打印出移动过程。

    输入

     

    输入n(4<=n<=10)。

    输出

     

    初始到目标的所有步骤,具体看样例。

    样例输入

     

    样例输出

     解题思路: 从边界开始手动模拟 找递归条件即可

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <cstring>
     5 #include <cstdlib>
     6 using namespace std;
     7 
     8 int n,step;
     9 int positionone,positiontwo;
    10 char ss[35];
    11 
    12 
    13 void Print(){
    14     printf("step %d:",step++);
    15     printf("%s
    ",ss+1);
    16 }
    17 
    18 void Move(int Position){
    19     ss[positionone]=ss[Position];
    20     ss[positiontwo]=ss[Position+1];
    21     ss[Position]=ss[Position+1]='-';
    22     positionone=Position;
    23     positiontwo=Position+1;
    24     Print();
    25 }
    26 
    27 void Calculation(int n){
    28     if(n==4){
    29         Move(4),Move(8),Move(2),Move(7),Move(1);
    30     }
    31     else{
    32         Move(n),Move((n<<1)-1),Calculation(n-1);
    33     }
    34 }
    35 
    36 int main(){
    37     cin>>n;
    38     for(int i=1;i<=n;i++) ss[i]='o';
    39     for(int i=n+1;i<=2*n;i++) ss[i]='*';
    40     ss[2*n+1]=ss[2*n+2]='-';
    41     Print();
    42     positionone=2*n+1,positiontwo=2*n+2;
    43     Calculation(n);
    44 }
    View Code
  • 相关阅读:
    [转载]网站运营粮草要先行
    微信公众平台开发(一) 配置接口
    UI框架说明
    布局
    DataGrid表格控件
    Dialog控件
    mysql出现 too many connections
    JVM调优案例
    ArrayBlockingQueue源码阅读
    jdk命令行工具
  • 原文地址:https://www.cnblogs.com/qq-1585047819/p/11244556.html
Copyright © 2020-2023  润新知