洛谷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 黑白棋子的移动 题解的主要内容,如果未能解决你的问题,请参考以下文章