64bit IO Format: %lld
題目描述
圈圈圓圓圈圈,lulu小朋友最近看喜羊羊看多了,老是受刺激就畫圓圈,聽到小於8的數字時,還會畫出十分有規律的圓圈,現在你需要根據樣例觀察出規律,編寫程序,根據輸入的數字n(n<8),輸出對應的圓圈。
輸入描述:
第一行是樣例數T(T<9) 第2到2+T-1行每行有一個整數n(n<8),代表lulu聽到的數字
輸出描述:
聽到對應數字時,輸出對應樣子的圓圈。
輸入
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;
}