蓝桥杯经典图形题 —— 打印大X、等腰三角形

打印大X

题目: 小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度。
为了便于比对空格,所有的空白位置都以句点符来代替。

要求输入两个整数m n,表示笔的宽度,X的高度。用空格分开(0 要求输出一个大X

例如,用户输入:
3 9
程序应该输出:

***.....***
.***...***.
..***.***..
...*****...
....***....
...*****...
..***.***..
.***...***.
***.....***

再例如,用户输入:
4 21
程序应该输出

****................****
.****..............****.
..****............****..
...****..........****...
....****........****....
.....****......****.....
......****....****......
.......****..****.......
........********........
.........******.........
..........****..........
.........******.........
........********........
.......****..****.......
......****....****......
.....****......****.....
....****........****....
...****..........****...
..****............****..
.****..............****.
****................****

代码加注释如下所示:

#include 
#include 
int main()
{
    int m, n;   // 笔的宽度,X的高度
    scanf("%d%d", &m, &n);
    
    int index = n - 1;  // 第一行后面图形的索引位置 
    int tmp = 0;
    int i, j, k, l;
    
    int flag = -1;
    int ff = 0;
    
    for (i = -(n / 2); i <= n / 2; ++i) // 21 行 
    {
   	for (j = 0; j < n / 2 - abs(i); ++j) 	// 前一半的 .
   	    printf(".");
  	
  	for (k = 0; k < m; ++k)			// . 后面的四个 *
   	    printf("*");
  	
  	for (l = 0; l < index - (j + k); ++l)	// * 后面的 .
   	    printf(".");
  	
  	if (l == 0)		// 两个 "四个*" 开始接触产生的一个小算法
  	{
   	    k = tmp + ff;
   	    
   	    if (i < 0) tmp += 2;
   	    else  tmp -= 2;
   	    
   	    if (ff == 0 && m % 2 == 1)
   	    {
    		k += (m % 2 == 0) ? 2 : 1;
    		ff = (m % 2 == 0) ? 2 : 1;
   	    }
  	}
        
        else k = 0;
    
        for (; k < m; ++k)	// 第二个 "四个*" 到底输出几个 ?
   	    printf("*");
    
    	for (j = 0; j < n / 2 - abs(i); ++j)
   	    printf(".");
  
     	if (i >= 0) flag = 1;
  	    index += flag;
    
    	printf("\n");
    }
   
    return 0;
}

当我们输入 10, 31时,效果如下:
蓝桥杯经典图形题 —— 打印大X、等腰三角形_第1张图片


.

等腰三角形

题目:
本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:

  1. 先用1,2,3,…的自然数拼一个足够长的串
  2. 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
    比如,当三角形高度是8时:
       1
      2 1
     3   8
    4     1
   5       7
  6         1
 7           6
891011121314151

输入,一个正整数n(3 输出,用数字填充的等腰三角形。

为了便于测评,我们要求空格一律用"."代替。

例如:
输入:
5
程序应该输出:

....1
...2.1
..3...2
.4.....1
567891011

再例如:
输入:
10
程序应该输出:

.........1
........2.2
.......3...2
......4.....2
.....5.......1
....6.........2
...7...........0
..8.............2
.9...............9
1011121314151617181

再例如:
输入:
15

程序应该输出:

..............1
.............2.3
............3...2
...........4.....3
..........5.......1
.........6.........3
........7...........0
.......8.............3
......9...............9
.....1.................2
....0...................8
...1.....................2
..1.......................7
.1.........................2
21314151617181920212223242526

此题我们使用 C++11 标准写(蓝桥杯并不允许,并且使用数组的思想). . .

代码如下:

#include  
#include 
#include 
using namespace std;

int main()
{
    int num;
    cin >> num;   // 输入三角形的高度  
    string str;
  
    for (int i = 1; i < num * num; i++)
  	str += to_string(i);
    
    int arr[500][500] = { 0 }; // 存放三角形 
    int row = 0;     // 第一个元素所在的位置 
    int col = num - 1;
    int tmpR = row, tmpC = col;
    int k = 0;
 
    while (tmpR != num - 1) // 没有到底
    {
   	arr[tmpR][tmpC] = str[k++];
  	++tmpR; --tmpC;
    }
    
    while (tmpC != col * 2)
    {
  	arr[tmpR][tmpC] = str[k++];
  	++tmpC;
    }
    
    while (tmpR != 0)
    { 
  	arr[tmpR][tmpC] = str[k++];
  	--tmpR; --tmpC;
    }
    
    for (int i = 0; i < num; i++)
    {
  	for (int j = num * 2 - 1; j >= 0; j--)
  	{
   	    if (arr[i][j] != 0)
   	    {
    		for (int k = 0; k < j; k++)
    	    	{
     		    if (arr[i][k] == 0)
      			arr[i][k] = '.';
    		}
   	    }
  	}
    }
    
    for (int i = 0; i < num; i++)
    {
  	for (int j = 0; j < num * 2; j++)
   	    cout << (char)arr[i][j];
  	cout << endl;
    }
    
    return 0;
}

当我们输入 30 时,效果如下所示:
蓝桥杯经典图形题 —— 打印大X、等腰三角形_第2张图片


.

浪子花梦

一个有趣的程序员 ~

你可能感兴趣的:(蓝桥杯,/,经典算法题)