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


先来观察一下样例:

当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;
} 

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