山東科技大學OJ Print Graphics Problem (II)
阿新 • • 發佈:2019-01-14
對於這種輸出菱形樣式的圖形我在這裡為大家總結了一點簡單方法,這需要一點點抽象思維,但也不是很難的哦,大家不要害怕,請聽小鑫娓娓道來。
首先我們要了解編譯器輸出格式以及C語言程式碼的整體趨向性,編譯器輸出格式是以行輸出標準的,C語言程式碼一般是以正向發展為主要趨勢的,讓我們看樣例輸出格式,一個空心的菱形,在我們之前所接觸的輸出圖形樣式都是實菱形為主,這種空心圖形沒有過多接觸,但也不是沒有辦法的,掌握每一行的輸出技巧,暴力解法是可以解出來的,但是程式碼量過於龐大,小鑫比較懶不想寫這麼多程式碼,於是我就想出來一種新方法:將輸出圖形二維化,想象成二維笛卡爾座標系,但也不是一般的笛卡爾座標系,這個座標的縱座標是向下指的。下面我用一個圖來解釋一下吧:
圍成菱形的四條線大家應該很容易就猜出來就是| X | + | Y | = N(N為輸入的數)
二話不說先上程式碼:
#include<stdio.h> #include<stdlib.h> int print_graphic(int n) { int b,i,j,k; int x,y; if(n%2==0) { for(y = -n+1 ; y <=0 ;y++) { for(x= -n+1 ; x <n; x++) { if(abs(y)+abs(x) < n) printf("+"); else if(-x + y > -n) printf(" "); } printf("\n"); } } else { for(y = 1 ; y <=n ;y++) { for(x= -n+1; x <n; x++) { if(abs(y)+abs(x) <= n) printf("+"); else if(x + y < n) printf(" "); } printf("\n"); } } } int main() { int num,z=0; while(scanf("%d", &num)!=EOF&&num) { z++; if(z>=2) printf("\n"); print_graphic(num); } return 0; }
我用一個輸出圖形的函式來實行這個操作,實際上不用也可以,直接就把 if(n%2==0)和else 那兩段程式碼拖到主函式裡面就可以啦。函式的運用主要是培養模組化的思維,不如一開始就用這種方式來寫程式碼,為以後鋪路。