P1259 黑白棋子的移动

题干

题目链接:https://www.luogu.com.cn/problem/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*

思路

分析样例

将样例每两行分开一次:

ooooooo*******--
oooooo--******o*
oooooo******--o*
ooooo--*****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*
    //在最后的4行结尾都是"o*o*o*"
    //"oo"与"--"交换
    //"--"与"*o"交换
    //"o*"与"--"交换
    //写代码时需要特判

代码实现

#include<iostream>
using namespace std;
char a[10000];
int n,sp;
void mv(int k)
{
    for(int j=0;j<=1;j++)
    {
        a[sp+j]=a[k+j];
        a[k+j]=‘-‘;
    }
    sp=k;
    for(int i=1;i<=2*n+2;i++)
        cout<<a[i];
    cout<<endl;
}
void check(int x)
{
    if(x==4){//等于4时进行特判
        mv(4);mv(8);mv(2);mv(7);mv(1);
    }
    else{
        mv(x);mv(2*x-1);check(x-1);
    }
}
int main()
{
    cin>>n;
    sp=2*n+1;
    for(int i=1;i<=n;i++)a[i]=‘o‘;
    for(int i=n+1;i<=2*n;i++)a[i]=‘*‘;
    a[2*n+1]=‘-‘;
    a[2*n+2]=‘-‘;
    for(int i=1;i<=2*n+2;i++)
        cout<<a[i];
    cout<<endl;//先对于初始状态进行输出
    check(n);
}

P1259 黑白棋子的移动

上一篇:数据驱动已成科技发展新浪潮


下一篇:Android Mms专题之:PDU介绍