> 文档中心 > C++ 打印图形综合题解 (递归+分治)【附代码】

C++ 打印图形综合题解 (递归+分治)【附代码】

打印图形这种题主要就是想办法找到一个方法递归打印,下面我们来一起看一看主要的是哪些题目。

1  打印三角形

打印如下图案,n \le 10

1*   2* *     *3* * * *  *   *    * *      * 4* * * * * * * *   *   *   *   *     * *     * ***  * * * *    *   *      * * *   5* * * * * * * * * * * * * * * *     *   *   *   *   *   *   *   ** *     * *     * *     * *  ****    * * * *  * * * *      *   *    *   * * *      * *   * *     * * * * * * * **   *   *   *  * *     * *    **      * * * * *   *   * *     *6* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *    * *     * *     * *     * *     * *     * *     * *     * *      ******** * * * *  * * * *  * * * *  * * * *   *   *    *   *    *   *    *   *     * *      * *      * *      * ** * * *  * * * * * * * *   * * * * * * * *    *   *   *   *     *   *   *   *      * *     * ** *     * * **  **   * * * *    * * * *     *   *      *   ** * * *  *   *    * * * * * * * * * * * * * * * *      *   *   *   *   *   *   *   * * *     * *     * *     * *   ****     * * * *  * * * **   *    *   *  * *      * *    * *      * * * * * * * * *   *   *   *   * *     * *     *** * * *  *   *    * *      * 

这道题比较简单的方法就是递归打印。

首先可以找一个字符数组记录每个位置的信息,不过最好开个三维的,这样把n为1到10的情况全部记录,比较方便。

然后仔细观察后,不难发现:所有图案均有三个较小图案组成,这样直接将它按顺序放在数组里即可(所以知道开三维数组的好处了吗?)

但是我们还发现打印的里面有空格和空行,那怎么办呢?

虽说你把空格存入数组再打印也不能说是不行,但是:

1. 数组空间大4倍。(因为空格也要存进去)

2. 递归处理起来要麻烦不少。

所以最好先递归,到打印时再处理空格与空行。

所以来看看代码吧:

//NW1405C 22-04-23#include using namespace std;char a[11][1050][1050];int ro,co;void make(int n)//r,c为开始打印的位置{int p=pow(2,n-1),q=pow(2,n-2);for (int i=1;i<=p;i++)for (int j=1;j<=q;j++)a[n][i][j]=a[n-1][i][j];for (int i=1;i<=p;i++)for (int j=1;j<=q;j++)a[n][i+p][j]=a[n-1][i][j];for (int i=1;i<=p;i++)for (int j=1;j<=q;j++)a[n][i][j+q]=a[n-1][i][j];return;}int main() {ios::sync_with_stdio(0);cin.tie(0);int n;for (int i=1;i<=10;i++)for (int j=1;j<=1024;j++)for (int k=1;k<=1024;k++)a[i][j][k]=' ';a[1][1][1]='*';for (int i=2;i>n){for (int i=1;i<=pow(2,n);i+=2){for (int j=1;j<=pow(2,n);j++)cout<<a[n][i][j]<<" ";cout<<endl;}cout<<"\n";}return 0;}

(写的不好或者太麻烦,欢迎评论)

运行截图:

2  打印三角形2 (打印边)

n \le 10

1 /\ /__\2   /\     /__\   /\  /\ /__\/__\3/\      /__\    /\  /\  /__\/__\/\      /\     /__\    /__\   /\  /\  /\  /\ /__\/__\/__\/__\4 /\ /__\      /\  /\    /__\/__\  /\      /\/__\    /__\     /\  /\  /\  /\   /__\/__\/__\/__\ /\/\      /__\     /__\    /\  /\   /\  /\  /__\/__\ /__\/__\/\      /\      /\      /\     /__\    /__\    /__\    /__\   /\  /\  /\  /\  /\  /\  /\  /\ /__\/__\/__\/__\/__\/__\/__\/__\5   /\     /__\   /\  /\ /__\/__\      /\      /\    /__\    /__\  /\  /\  /\  /\/__\/__\/__\/__\     /\/\   /__\     /__\ /\  /\   /\  /\      /__\/__\ /__\/__\    /\      /\      /\      /\  /__\    /__\    /__\    /__\/\  /\  /\  /\  /\  /\  /\  /\     /__\/__\/__\/__\/__\/__\/__\/__\   /\  /\ /__\/__\      /\  /\     /\  /\    /__\/__\   /__\/__\  /\      /\ /\      /\/__\    /__\      /__\    /__\     /\  /\  /\  /\    /\  /\  /\  /\   /__\/__\/__\/__\  /__\/__\/__\/__\ /\/\/\/\      /__\     /__\     /__\     /__\    /\  /\   /\  /\   /\  /\   /\  /\  /__\/__\ /__\/__\ /__\/__\ /__\/__\/\      /\      /\      /\      /\      /\      /\      /\     /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\   /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\ /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\6/\      /__\    /\  /\  /__\/__\/\      /\     /__\    /__\   /\  /\  /\  /\ /__\/__\/__\/__\      /\/\    /__\     /__\  /\  /\   /\  /\/__\/__\ /__\/__\     /\      /\      /\      /\   /__\    /__\    /__\    /__\ /\  /\  /\  /\  /\  /\  /\  /\      /__\/__\/__\/__\/__\/__\/__\/__\    /\  /\  /__\/__\/\  /\     /\  /\     /__\/__\   /__\/__\   /\      /\ /\      /\ /__\    /__\      /__\    /__\      /\  /\  /\  /\    /\  /\  /\  /\    /__\/__\/__\/__\  /__\/__\/__\/__\  /\/\/\/\/__\     /__\     /__\     /__\     /\  /\   /\  /\   /\  /\   /\  /\   /__\/__\ /__\/__\ /__\/__\ /__\/__\ /\      /\      /\      /\      /\      /\      /\      /\      /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\    /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/\      /\     /__\    /__\   /\  /\  /\  /\ /__\/__\/__\/__\      /\      /\     /\      /\    /__\    /__\   /__\    /__\  /\  /\  /\  /\ /\  /\  /\  /\/__\/__\/__\/__\      /__\/__\/__\/__\     /\/\    /\/\   /__\     /__\  /__\     /__\ /\  /\   /\  /\/\  /\   /\  /\      /__\/__\ /__\/__\     /__\/__\ /__\/__\    /\      /\      /\      /\   /\      /\      /\      /\  /__\    /__\    /__\    /__\ /__\    /__\    /__\    /__\/\  /\  /\  /\  /\  /\  /\  /\      /\  /\  /\  /\  /\  /\  /\  /\     /__\/__\/__\/__\/__\/__\/__\/__\    /__\/__\/__\/__\/__\/__\/__\/__\   /\  /\  /\  /\ /__\/__\/__\/__\      /\  /\     /\  /\     /\  /\     /\  /\    /__\/__\   /__\/__\   /__\/__\   /__\/__\  /\      /\ /\      /\ /\      /\ /\      /\/__\    /__\      /__\    /__\      /__\    /__\      /__\    /__\     /\  /\  /\  /\    /\  /\  /\  /\    /\  /\  /\  /\    /\  /\  /\  /\   /__\/__\/__\/__\  /__\/__\/__\/__\  /__\/__\/__\/__\  /__\/__\/__\/__\ /\/\/\/\/\/\/\/\      /__\     /__\     /__\     /__\     /__\     /__\     /__\     /__\    /\  /\   /\  /\   /\  /\   /\  /\   /\  /\   /\  /\   /\  /\   /\  /\  /__\/__\ /__\/__\ /__\/__\ /__\/__\ /__\/__\ /__\/__\ /__\/__\ /__\/__\/\      /\      /\      /\      /\      /\      /\      /\      /\      /\      /\      /\      /\      /\      /\      /\     /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\    /__\   /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\ /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\

 这道题与上面的差不多,只不过要打印边,但总体还是递归。

不过这道题要注意几个地方:

1. 此题要设置初始值,也就是:

   /\

 /__\

2. 这道题赋初值时,不能写成 ='\' ,这样会被误识别,一定要写成:=92;

( \ 的ASCII为92)

代码时间:

#include using namespace std;char a[11][3001][3001];int ro,co;  void make(int n)//r,c为开始打印的位置{    int p=pow(2,n-1),q=pow(2,n-2),r=pow(2,n);    for (int i=1;i<=p;i++) for (int j=1;j<=r;j++)     a[n][i][j+p]=a[n-1][i][j];    for (int i=1;i<=p;i++) for (int j=1;j<=r;j++)     a[n][i+p][j]=a[n-1][i][j];    for (int i=1;i<=p;i++) for (int j=1;j<=r;j++)     a[n][i+p][j+r]=a[n-1][i][j];    return;}  int main() {    ios::sync_with_stdio(0);    cin.tie(0);    int n;    for (int i=1;i<=10;i++) for (int j=1;j<=2500;j++)     for (int k=1;k<=2500;k++)  a[i][j][k]=' ';    a[1][1][2]='/';a[1][1][3]=92;    a[1][2][1]='/';a[1][2][2]='_';a[1][2][3]='_';a[1][2][4]=92;    for (int i=2;i>n)    { for (int i=1;i<=pow(2,n);i++) {     for (int j=1;j<=pow(2,n+1);j++)  cout<<a[n][i][j];     cout<<endl; }    }    return 0;}

3  打印 O

n \le 7

1 O OOO O 2    OOOOO     O  O  O OOOOOOOOO O  O  O     OOOOO    3      O    OOO    O  O  O  O     OOOOOOOOO     O  O  O  O    OOO    O   O O OOOO      OOO      OOOO O O     O  O  O  O  O  O  O  O  O OOOOOOOOOOOOOOOOOOOOOOOOOOO O  O  O  O  O  O  O  O  O     O O OOOO      OOO      OOOO O O   O    OOO    O  O  O  O     OOOOOOOOO     O  O  O  O    OOO    O      4     O  OOO  OO  O  O   OOOOOOOOO   O  O  OO  OOO  O O O O     OOO      OOO      OOO     O O O   O  O  O  O  O  O  O  O  O      OOOOOOOOOOOOOOOOOOOOOOOOOOO      O  O  O  O  O  O  O  O  O   O O O     OOO      OOO      OOO     O O O O  OOO  OO  O  O   OOOOOOOOO   O  O  OO  OOO  O    O     O     O    OOO   OOO   OOO    O     O     O  O  O  O      O  O  O      O  O  O     OOOOOOOOO    OOOOOOOOO    OOOOOOOOO     O  O  O      O  O  O      O  O  O  O     O     O    OOO   OOO   OOO    O     O     O   O O O O O O O O OOOO      OOO      OOO      OOO      OOO      OOO      OOO      OOO      OOOO O O O O O O O O     O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O     O O O O O O O O OOOO      OOO      OOO      OOO      OOO      OOO      OOO      OOO      OOOO O O O O O O O O   O     O     O    OOO   OOO   OOO    O     O     O  O  O  O      O  O  O      O  O  O     OOOOOOOOO    OOOOOOOOO    OOOOOOOOO     O  O  O      O  O  O      O  O  O  O     O     O    OOO   OOO   OOO    O     O     O    O  OOO  OO  O  O   OOOOOOOOO   O  O  OO  OOO  O O O O     OOO      OOO      OOO     O O O   O  O  O  O  O  O  O  O  O      OOOOOOOOOOOOOOOOOOOOOOOOOOO      O  O  O  O  O  O  O  O  O   O O O     OOO      OOO      OOO     O O O O  OOO  OO  O  O   OOOOOOOOO   O  O  OO  OOO  O     

(这个题就不放5了,太长了)

这个题也是第1题的变种,只不过从递归3个小部分,变成5个部分了。

注意上面的圈是大写O

直接代码:

#includeusing namespace std;char a[8][2200][2200]; void make(int n){    int r,c;//strating point    c=pow(3,n-1);r=0;    for (int i=1;i<=pow(3,n-1);i++) for (int j=1;j<=pow(3,n-1);j++)     a[n][r+i][c+j]=a[n-1][i][j];    c=0;r=pow(3,n-1);    for (int i=1;i<=pow(3,n-1);i++) for (int j=1;j<=pow(3,n-1);j++)     a[n][r+i][c+j]=a[n-1][i][j];    c=pow(3,n-1);r=pow(3,n-1);    for (int i=1;i<=pow(3,n-1);i++) for (int j=1;j<=pow(3,n-1);j++)     a[n][r+i][c+j]=a[n-1][i][j];    c=pow(3,n-1)*2;r=pow(3,n-1);    for (int i=1;i<=pow(3,n-1);i++) for (int j=1;j<=pow(3,n-1);j++)     a[n][r+i][c+j]=a[n-1][i][j];    c=pow(3,n-1);r=pow(3,n-1)*2;    for (int i=1;i<=pow(3,n-1);i++) for (int j=1;j>n)    { for (int i=1;i<=7;i++)     for (int j=1;j<=2200;j++)  for (int k=1;k<=2200;k++)      a[i][j][k]=' '; a[1][1][2]='O'; a[1][2][1]='O';a[1][2][2]='O';a[1][2][3]='O'; a[1][3][2]='O'; for (int i=2;i<=7;i++) make(i); for (int i=1;i<=pow(3,n);i++) {     for (int j=1;j<=pow(3,n);j++)  cout<<a[n][i][j];     cout<<endl; }    }    return 0;}