標籤:out gpo down 包含 log 9.png 技術 sync sig
概述
- 一般圖形輸出無法就是用迴圈輸出 ,提前構造好圖形。
兩種方式
** 類比法直接輸出**
** 二維數組 構造輸出**
問題描述利用字母可以組成一些美麗的圖形,下面給出了一個例子:ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC這是一個5行7列的圖形,請找出這個圖形的規律,並輸出一個n行m列的圖形。輸入格式輸入一行,包含兩個整數n和m,分別表示你要輸出的圖形的行數的列數。輸出格式輸出n行,每個m個字元,為你的圖形。範例輸入5 7範例輸出ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC
解法一 直接輸出 類比法
#include <iostream>#include <cstring>#include <string>#include <algorithm>#include <cmath>using namespace std;int main(){ string src="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int length=src.length(); int n,m,j=0;string sum;string temp; cin>>n>>m; int k=m; for(int i=0;i<n;i++){ sum=""; for(j=0;j<k;j++){ sum+=src[j]; } k--; if(i!=0){ temp+=src[i]; } reverse(temp.begin(),temp.end()); cout<<temp+sum<<endl; reverse(temp.begin(),temp.end()); }}
解法二 二維數組 直接輸出
#include <iostream> using namespace std; //方法二 int main() { unsigned int n,m; cin>>n>>m; int array[n][m]; for(int i=0;i<m;i++)//給第一行賦值65,66,67... 轉化為char型即為A,B,C... { array[0][i] = i + 65; } for(int i=1;i<n;i++) { for(int j=1;j<m;j++)//從第二行開始,每一行從第二位元開始的值都是上一行的右移一位後直接搬下來的 { array[i][j] = array[i-1][j-1]; } array[i][0] = array[i-1][0] + 1;//給每一行的第一位賦值 } for(int i=0;i<n;i++)//輸出 { for(int j=0;j<m;j++) { cout<<(char)array[i][j]; } cout<<endl; } return 0; }
解法三 找規律 這道題 與常規的還是有些不同的
- 根據規律 可以看出來 A為根座標開始向兩邊移動 ,接法非常巧妙
#include <iostream>#include <cstring>#include <string>#include <algorithm>#include <cmath>using namespace std;int main(){ int n,m; ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cout<<(char)(fabs(j-i)+'A'); } cout<<endl; }}
總結
- 輸出圖形 是對迴圈能力的最重要的掌控 ,其中還涉及到了矩陣(旋轉, 乘法,出發等)相關的知識要點。
《演算法》C/C++ 圖形處理