本蒟蒻这题用的打表做法,其实也可以理解为是一种递推。
先来观察一下样例:
当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