首页 > 其他分享 >洛谷P1259 黑白棋子的移动 题解

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

时间:2023-01-25 09:55:35浏览次数:72  
标签:输出 洛谷 -- 题解 黑白 P1259 int 棋子

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


先来观察一下样例:

当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,int,棋子
From: https://www.cnblogs.com/zhangqixun/p/17066666.html

相关文章

  • LeetCode-670. 最大交换-题解分析
    题目来源670.最大交换题目详情给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。示例1:输入:2736输出:7236解释:交换数字2和数字......
  • 题解 ARC154D【A + B > C ?】
    显然\(1+1>x\)对任意大于\(1\)的正整数\(x\)都不成立。利用这一点,我们可以在\(n-1\)次询问内问出\(1\)的位置。具体地,首先假设\(p_1\)为\(1\),记我们假设的为......
  • 莫比乌斯函数(P3455 题解)
    题目链接。我们定义\(n\)的莫比乌斯函数为\(\mu_n\)。我们将\(n\)分解质因式后为\(n=p_1^{\alpha_1}p_2^{\alpha_2}\cdotsp_k^{\alpha_k}\)则\(\mu_n=\begin......
  • CF1726D 题解
    EdgeSplit。一开始nt了,以为红边为一颗树,蓝边为剩余边,蓝边就不会有环了。假设有\(n\)个点,\(m\)条边,且这些边没有出现环,那么连通块的数量为\(n-m\),因为不存在环,......
  • AT_abc285_e 题解
    WorkorRest。我们考虑相邻两个假期之间的工作效率和。设\(len\)为相邻两个假期间隔的天数。举个例子,如果假期为\(\{1,3,7\}\),那么\(len\)为\(\{1,4\}\)。根......
  • CF1768C 题解
    \(\mathcalSolution\)【题意】题目要你构造两个序列\(p,q\),满足\(\max\{p_i,q_i\}=a_i\)。【分析】如果满足\(\max\{p_i,q_i\}=a_i\),则满足\(p_i=a_i,q_i\le......
  • CF1768D 题解
    \(\mathcalSolution\)【题意】我们可以交换任意两个数,求最小操作几次能让逆序对变成\(1\)。【分析】如果逆序对为\(1\)的排列一定是:\(2,1,\cdotsn\)\(1,3,......
  • ABC281E 题解
    \(\mathcalSolution\)本题的思路类似于对顶堆。用两个multiset来维护。\(S_1\)为第一个multiset;\(S_2\)为第二个multiset。\(S_1\)维护前\(K\)个值,\(S_2\)......
  • AT_abc277_e 题解
    \(\mathcalSolution\)【题意】给定无向图,当\(a_i=1\)时,该条边才能走。在给我们\(k\)个点,\(S_1,S_2,\cdots,S_k\),到了这些点可以选择是否取反\((1\to0,0\t......
  • 2023牛客寒假算法基础集训营1 个人题解(ACDHKL)
    A.WorldFinal?WorldCup!(I)题意:给10场比赛的点球输赢情况,奇数为A队点球,偶数为B队点球思路:用两个变量x,y来分别存A队当前赢的场次和B队当前赢的场次然后就就扫......