洛谷P1259 黑白棋子的移动

题目描述

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

○○○○○●●●●●

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

○●○●○●○●○●

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

输入格式

一个整数n(n<=100)

输出格式

若干行,表示初始状态和每次移动的状态,用"o"表示白子,"*"表示黑子,"-"表示空行。

输入输出样例

输入 #1
7
输出 #1
ooooooo*******--
oooooo--******o*
oooooo******--o*
ooooo--*****o*o*
ooooo*****--o*o*
oooo--****o*o*o*
oooo****--o*o*o*
ooo--***o*o*o*o*
ooo*o**--*o*o*o*
o--*o**oo*o*o*o*
o*o*o*--o*o*o*o*
--o*o*o*o*o*o*o*

思路:


代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<string>
#define N 1001
using namespace std;
int n,st,sp;
char a[N];
void print()
{
    for(int i=1;i<=2*n+2;i++)
        printf("%c",a[i]);
    printf("\n");
}
void move(int m)//挪棋子
{
    a[sp]=a[m];//空格填上对应位置的棋子
    a[sp+1]=a[m+1];
    a[m]=a[m+1]='-';
    sp=m;
    print();
}
void mv(int m)
{
    if(m==4)//第四种情况的时候要分类讨论
    {
        move(4);
        move(8);
        move(2);
        move(7);
        move(1);
    }
    else//如果还没到第四种情况
    {
        move(m);//move函数里面的数其实是当前要挪动靠前棋子的位置,手续挪动m和m+1两个棋子,一开始要将它们挪到最后,所以sp要初始化为2*n+1,这是第一个空格的位置
        move(2*m-1);
        mv(m-1);
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        a[i]='o';
    for(int i=n+1;i<=2*n;i++)
        a[i]='*';
    for(int i=2*n+1;i<=2*n+2;i++)
        a[i]='-';
    st=0;
    sp=2*n+1;
    print();
    mv(n);
    return 0;
}

 

posted @ 2020-05-27 18:07  徐明拯  阅读(505)  评论(0编辑  收藏  举报