藍橋杯基礎練習 字母圖形
阿新 • • 發佈:2019-01-09
題目描述
演算法設計
以樣例為例:n=5,m=7
構造輔助陣列A
設計一個長為m+n-1=11的如下陣列A:
下標 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
字元 | E | D | C | B | A | B | C | D | E | F | G |
設計方法是確定陣列A中字元A
的位置Aindex=n-1=4,然後陣列A的 0 到 Aindex-1 位置的字元分別比字元A的ASCII碼大n-1、n-2······1;陣列A的 Aindex+1 到 m+n-2 位置的字元分別比字元A
大1、2······m-1。
尋找規律
那麼輸出的5行字串的首末字元在陣列A中的位置如下(假設輸出的5行字串起始行行號為0):
行號 | 起始字元在陣列A中位置 | 末尾字元在陣列A中位置 | 輸出字串 |
---|---|---|---|
0 | 4 | 10 | ABCDEFG |
1 | 3 | 9 | BABCDEF |
2 | 2 | 8 | CBABCDE |
3 | 1 | 9 | DCBABCD |
4 | 0 | 7 | EDCBABC |
假設陣列A中通過以上比較我們可以總結出行號為 的輸出字串的首末字元在陣列A中位置分別為、。掌握這樣的規律後就編寫演算法就很容易了。
C++程式碼
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
scanf("%d%d",&n,&m);
char A[n+m-1];//定義陣列A
int Aindex=n-1;//確定字元'A'的位置為n-1
for(int i=Aindex;i>=0;--i)//填充陣列A的0~Aindex-1位置的字元
A[i]=(char)('A'+Aindex-i);
for(int i=Aindex;i<n+m-1;++i)//填充陣列A的Aindex+1~m+n-2位置的字元
A[i]=(char)('A'+i-Aindex);
for (int i=0;i<n;++i){//輸出n行字串
for(int j=0;j<m;++j)
printf("%c",A[Aindex-i+j]);
puts("");//換行
}
return 0;
}
Java程式碼
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt(),m=input.nextInt();
char[] A=new char[n+m-1];//定義陣列A
int Aindex=n-1;//確定字元'A'的位置為n-1
for(int i=Aindex;i>=0;--i)//填充陣列A的0~Aindex-1位置的字元
A[i]=(char)('A'+Aindex-i);
for(int i=Aindex;i<n+m-1;++i)//填充陣列A的Aindex+1~m+n-2位置的字元
A[i]=(char)('A'+i-Aindex);
for(int i=0;i<n;++i){//輸出n行字串
for(int j=0;j<m;++j)
System.out.print(A[Aindex-i+j]);
System.out.println();//換行
}
}
}