圓圈

時間限制:C/C++ 1秒,其他語言2秒
空間限制: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;
題解:首先這是個3的n次方的輸出。此圖總體可以劃分爲上中下三個方面。每個部分又可以劃分爲上中下三個塊。上下方面:每行可以看出前面的空格都是3的n-1次方。中間的話:中間每行有3的n-1空格。以此進行遞歸..........每當n=0時直接輸出O...代碼如下:
#include<cstdio>
#include<cmath>
int getLine(int n,int m){
	int dds;
	if(n==0){
		printf("O");
		return 0;
	}else{
		int ds=pow(3,n);
		if(m<=ds/3||m>ds/3*2){//上下塊
			for(int i=1;i<=ds/3;i++){
				printf(" ");
			}
			dds=getLine(n-1,m%(ds/3))+ds/3;
		}else{//中間
			dds=getLine(n-1,m%(ds/3));
			for(int i=1;i<=ds/3;i++){
				printf(" ");
			}
			for(int i=1;i<=dds;i++){
				printf(" ");
			}
			getLine(n-1,m%(ds/3));
		}
	}
	return dds;
}
int main()
{
	int n,t;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
        int num;
		num=pow(3,n);
		for(int i=1;i<=num;i++){
			getLine(n,i);
			printf("\n");
		}
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章