洛谷P1259 黑白棋子的移动 题解

Posted zhangqixun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷P1259 黑白棋子的移动 题解相关的知识,希望对你有一定的参考价值。

蒟蒻这题用的打表做法,其实也可以理解为是一种递推。


先来观察一下样例:

当n为7时,输出共有14行,易得输出行数为2n。

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*

第一行和最后一行可以直接单独输出。

可以发现除了最后2-5行外前面的输出每两行都可以看成一组,规律也十分容易看出。

我们根据最后黑白棋子的组数分组,这样可以方便我们用循环输出。


 

话不多说,看代码:

#include<bits/stdc++.h>
using namespace std;
int main()
    int n,k=1;
    cin>>n;
    for(int i=1;i<=n;i++)
        cout<<"o";
    
    for(int i=1;i<=n;i++)
        cout<<"*";
    
    cout<<"--"<<endl;//第一行可以单独输出 
    int m=n;//用来记录 
    n-=1;//将第一行和最后一行看成一组,减去一组 
    while(n>=4)//具有规律的一共有n-4组 
        for(int i=1;i<=n;i++)
            cout<<"o";
        
        cout<<"--";
        for(int i=1;i<=n;i++)
            cout<<"*";
        
        for(int i=1;i<=k;i++)
            cout<<"o*";
        
        cout<<endl;
        
        for(int i=1;i<=n;i++)
            cout<<"o";
        
        for(int i=1;i<=n;i++)
            cout<<"*";
        
        cout<<"--";
        for(int i=1;i<=k;i++)
            cout<<"o*";
        
        cout<<endl;//换行 
        
        n--;// 规律组数减1 
        k++;//用来记录已移动完成的黑白棋子组数 
    
    int l=0;//从0开始,调用下面数组的元素。 
    string out[5] = "ooo--***o*","ooo*o**--*", "o--*o**oo*", "o*o*o*--o*";
    //对无法用递推来输出规律的部分打好表 
    n++;//上面的循环多减了1,这边加上,保证后面输出四行 
    while(n)
        cout<<out[l];//输出字符串数组 
        for(int i=1;i<=k-1;i++)
            cout<<"o*";
        
        n--;//剩余行数减1 
        l++;//准备调用下一个元素 
        cout<<endl;
        
        cout<<out[l];
        for(int i=1;i<=k-1;i++)
            cout<<"o*";
        
        cout<<endl;
        l++;
        n--;
    
    
    cout<<"--";
    for(int i=1;i<=m;i++)
        cout<<"o*";
    //最后一行单独输出。 
    return 0;
 

这道题只要仔细观察样例,寻找规律,递推关系其实并不复杂,值得注意的是每次输出的数量要做到分毫不差,所以在编写代码过程中需要不断在脑中模拟电脑的运行过程,这样可以避免后期复查带来的大量的工作量。

 

以上是关于洛谷P1259 黑白棋子的移动 题解的主要内容,如果未能解决你的问题,请参考以下文章

P1259 黑白棋子的移动

「分治」黑白棋子的移动

题解棋子移动

Codeforces 985A 题解

分治3--黑白棋子的移动

黑白棋子的移动