C++ 打印图形综合题解 (递归+分治)【附代码】
打印图形这种题主要就是想办法找到一个方法递归打印,下面我们来一起看一看主要的是哪些题目。
1 打印三角形
打印如下图案,
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 (打印边)
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
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;}