链接:https://www.nowcoder.com/acm/contest/67/G
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
圈圈圆圆圈圈,lulu小朋友最近看喜羊羊看多了,老是受刺激就画圆圈,听到小于8的数字时,还会画出十分有规律的圆圈,现在你需要根据样例观察出规律,编写程序,根据输入的数字n(n<8),输出对应的圆圈。
输入描述:
第一行是样例数T(T<9)
第2到2+T-1行每行有一个整数n(n<8),代表lulu听到的数字
输出描述:
听到对应数字时,输出对应样子的圆圈。
示例1
输入
4 0 1 2 3
输出
O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O
说明
当n=0时输出
O
当n=1时输出
*O
O*O
*O
当n=2时输出
****O
***O*O
****O
*O*****O
O*O***O*O
*O*****O
****O
***O*O
****O
上面的'O'是大写英文字母O,'*'代表空格,每一行最后一个O后面不带空格。
备注:
对于100%的数据,
0<T<9;
0<=n<8;
分析:递归。跟poj1941差不多.
#include<cstdio> #include<cstring> #include<cmath> using namespace std; char s[2189][2189]; void draw(int i,int j,int n)//从(i,j)开始画o { if(n==1) { s[i][j]='O'; s[i+1][j-1]='O'; s[i+1][j+1]='O'; s[i+2][j]='O'; } else { int dis=(int)pow(3.0,n-1); draw(i,j,n-1); draw(i+dis,j+dis,n-1); draw(i+dis,j-dis,n-1); draw(i+dis*2,j,n-1); } } int main() { int T,N; scanf("%d",&T); while(T--) { scanf("%d",&N); if(N==0) {printf("O ");continue;} for(int i=0;i<2189;i++) memset(s[i],' ',sizeof(s[i])); int dis=(int)pow(3.0,N); draw(1-1,(dis+1)/2-1,N); for(int i=0;i<=dis-1;i++) { int j=dis-1; while(true) { if(s[i][j]=='O') break; j--; } s[i][j+1]='