zoukankan      html  css  js  c++  java
  • 《算法》C/C++ 图形处理

    概述

    • 一般图形输出无法就是用循环输出 ,提前构造好图形。
    • 两种方式

    ** 模拟法直接输出**
    ** 二维数组 构造输出**

    问题描述
    利用字母可以组成一些美丽的图形,下面给出了一个例子:
    
    ABCDEFG
    
    BABCDEF
    
    CBABCDE
    
    DCBABCD
    
    EDCBABC
    
    这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
    
    输入格式
    输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
    输出格式
    输出n行,每个m个字符,为你的图形。
    样例输入
    5 7
    样例输出
    ABCDEFG
    BABCDEF
    CBABCDE
    DCBABCD
    EDCBABC
    

    解法一 直接输出 模拟法

    #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;
       }
    }
    
    

    总结

    • 输出图形 是对循环能力的最重要的掌控 ,其中还涉及到了矩阵(旋转, 乘法,出发等)相关的知识要点。
  • 相关阅读:
    阻止事件传播的常用方法
    原生JS获取元素的位置与尺寸
    FileReader 与canvas结合使用显示图片
    dot.js使用心得
    时间格式转换
    JS对象操作
    vue-awesome-swipe 基于vue使用的轮播组件 使用(改)
    vscode 插件推荐
    chrome 发送请求出现:Provisional headers are shown 提示
    手机端
  • 原文地址:https://www.cnblogs.com/dgwblog/p/8057990.html
Copyright © 2011-2022 走看看