試題 曆屆試題 列印十字圖
藍橋杯試題解答彙總連結
資源限制
時間限制:1.0s 記憶體限制:256.0MB
問題描述
小明為某機構設計了一個十字型的徽标(并非紅十字會啊),如下所示:

對方同時也需要在電腦dos視窗中以字元的形式輸出該标志,并能任意控制層數。
輸入格式
一個正整數 n 表示要求列印圖形的層數。
輸出格式
對應包圍層數的該标志。
樣例輸入
樣例一:
1
樣例二:
3
樣例輸出
樣例一:
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
樣例二:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
資料規模與約定
n<30
試題解析
以下為n=2時的情況以o點為坐标原點建立平面直角坐标系水準為x軸,豎直方向為y軸
. | . | $ | $ | $ | $ | $ | $ | $ | $ | $ | . | . |
---|---|---|---|---|---|---|---|---|---|---|---|---|
. | . | $ | . | . | . | . | . | . | . | $ | . | . |
$ | $ | $ | . | $ | $ | $ | $ | $ | . | $ | $ | $ |
$ | . | . | . | $ | . | . | . | $ | . | . | . | $ |
$ | . | $ | $ | $ | . | $ | . | $ | $ | $ | . | $ |
$ | . | $ | . | . | . | $ | . | . | . | $ | . | $ |
$ | . | $ | . | $ | $ | $(O) | $ | $ | . | $ | . | $ |
$ | . | $ | . | . | . | $ | . | . | . | $ | . | $ |
$ | . | $ | $ | $ | . | $ | . | $ | $ | $ | . | $ |
$ | . | . | . | $ | . | . | . | $ | . | . | . | & |
$ | $ | $ | . | $ | $ | $ | $ | $ | . | $ | $ | $ |
. | . | $ | . | . | . | . | . | . | . | $ | . | . |
. | . | $ | $ | $ | $ | $ | $ | $ | $ | $ | . | . |
結合題目給出的樣例觀察圖像不難發現這個圖像就是在中心十字形外圍n層十字架形狀的邊那麼現在就變成了線性規劃的問題:
根據規律我們可以得到幾個式子,當坐标(x,y)滿足式子的時候就輸出$不滿足就輸出.
①y=0,-2≤x≤2;或x=0,-2≤y≤2;
②|y|=2a+2,|x|≤2或|x|=2a+2,|y|≤2;
③|y|=2a,2a≤|x|≤2a+2或|x|=2a,2a≤|y|≤2a+2;
代碼
#include<stdio.h>
#include<stdlib.h>
int right(int x,int y,int n){
int a;// a用來确定他是第幾圈的
for(a = n;a >= 1;a--){// 判斷是否是符合條件的點
if((abs(y)==2*a+2 && abs(x)<=2*a)||(abs(x)==2*a+2 && abs(y)<=2*a)){
return 1;
}else if((abs(y)==2*a && abs(x)>=2*a && abs(x)<=2*a+2)||(abs(x)==2*a && abs(y)>=2*a && abs(y)<=2*a+2)){
return 1;
}else if((y==0 && abs(x)<=2)||(x==0 && abs(y)<=2)){
return 1;
}
}
return 0;
}
int main(){
int n=0;
scanf("%d",&n);
int i,j,len = 2*n+2;
for(i = -len;i <= len;++i){
for(j = -len;j <= len;++j){
if(right(i,j,n)){// i,j分别對應坐标軸的x,y
printf("$");
}else{
printf(".");
}
}
printf("\n");
}
return 0;
}