• 棋子移动 1295


    这道题比较难

    题目描述:

    有2n个棋子(n≥4)排成一行,开始位置为白色全部在左边,黑色全部在右边。(其中字母O表示白色棋子,字母X表示黑色棋子)OOOOXXXX。移动棋子的规则是:每次必须同时移动相邻两个棋子,颜色不限,可以左移也可以右移一空位上去,但不能调换两个棋子的左右位,每次移动必须跳过若干个棋子(不能平移),要求最后能够移成黑白相间的一行棋子。例如当n=4时,最终排列情况为:OXOXOXOX。输出棋子移动的过程。

    输入描述:

    多组输入,每组一个正整数,占一行。

    输出描述:

    输出移动步骤,每一步操作占一行

    样例输入:

    4

    样例输出:

    4,5-->9,10

    8,9-->4,5

    2,3-->8,9

    7,8-->2,3

    1,2-->7,8

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 int n,mj,mi,x,y;
     6 char a[101];
     7 void move(int i)
     8 {
     9     a[mj] = a[i];
    10     a[mj + 1] = a[i + 1];
    11     a[i] = '-';
    12     a[i + 1] = '-';
    13     mj = i;
    14     for(i = 0; i < 2 * n + 2; i++)
    15         //printf("%c", a[i]);
    16         if(a[i]=='-'){
    17             cout<<i+1<<","<<i+2<<"-->"<<x<<","<<y;
    18             x=i+1;
    19             y=i+2;
    20             break;
    21         }
    22     printf("
    ");
    23 }
    24 void fun(int n)
    25 {
    26     if (n == 4){        
    27         move(3);move(7); 
    28         move(1);move(6);
    29         move(0);
    30     }
    31     else{
    32         move(n - 1);
    33         move(2 * n - 2);
    34         fun(n - 1);
    35     }
    36 }
    37 int main()
    38 {
    39     int i, j;
    40     while(cin>>n){
    41         mi = 1;
    42         mj = 2* n;
    43         for(i = 0; i < n; i++)
    44             a[i] = 'o';
    45      
    46         for(i = n; i < 2 * n; i++)
    47             a[i] = '*';
    48         a[2*n] = '-';
    49         a[2*n + 1] = '-';
    50         x=2*n+1;
    51         y=2*n+2;
    52         fun(n);
    53     }
    54     return 0;
    55 }
    signal
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 int n, mj;
     6 int mi;
     7 char a[101];
     8 void move(int i)
     9 {
    10     a[mj] = a[i];
    11     a[mj + 1] = a[i + 1];
    12     a[i] = '-';
    13     a[i + 1] = '-';
    14     mj = i;
    15     printf("step%2d:", mi++);
    16     for(i = 0; i < 2 * n + 2; i++)
    17         printf("%c", a[i]);
    18     printf("
    ");
    19 }
    20 void fun(int n)
    21 {
    22     if (n == 4){        
    23         move(3);move(7); 
    24         move(1);move(6);
    25         move(0);
    26     }
    27     else{
    28         move(n - 1);
    29         move(2 * n - 2);
    30         fun(n - 1);
    31     }
    32 }
    33 int main()
    34 {
    35     int i, j;
    36     scanf("%d", &n);
    37     mi = 1;
    38     mj = 2* n;
    39     for(i = 0; i < n; i++)
    40         a[i] = 'o';
    41  
    42     for(i = n; i < 2 * n; i++)
    43         a[i] = '*';
    44  
    45     a[2*n] = '-';
    46     a[2*n + 1] = '-';
    47     printf("step%2d:", 0);
    48     for(i = 0; i < 2 * n + 2; i++)
    49         printf("%c", a[i]);
    50     puts("");
    51     fun(n);
    52     return 0;
    53 }
    转载请标明出处
  • 相关阅读:
    插入排序-Java
    选择排序-java
    逻辑回归----梯度上升
    logistic回归----- 随机梯度下降法
    JAVA实现聚类指标的计算Purity、NMI、RI、Precision、Recall、F值。
    Python 条形图绘制
    java中接口的注意事项
    算法-双向队列
    算法-manacher-最长回文子串-1
    算法-kmp-1
  • 原文地址:https://www.cnblogs.com/zq-dmhy/p/11074332.html
Copyright © 2020-2023  润新知