字符数组覆盖复制———分形十字题解
题目跳转观看效果更佳原题解链接本题的思路是1. 确定真是数组适用范围2. 在范围内把上一级的分形十字分别复制到上方、下方、左 2 方和右方3. 每一次复制完之后要记得更新详细的复制范围数据数据格式整个分形十字的数组代码中为a采用char字符类型根据计算规模不可能超过2200*2200赋值的时候的范围确定的四个坐标采用int类型变量 代码中为bx ex by和ey 后面在进行函数运算的时候 会不断更新增加在函数部分还需要一个变量叫做k用来储存分形十字目前的规模使用int 后面在进行函数运算的时候 会不断更新增加输入的分形十字级别n 因为不会超过7 采用int此外我们还需要一个变量来确定长和宽的长度g 使用int也完全足够所以我为此创建一个叫做bewegen的函数void bewegen(int bx, int ex, int by, int ey, int k) { for (int i bx;iex;i) { for(int j by;jey;j) { a[ik][j]a[i][j]; } } for (int i bx;iex;i) { for(int j by;jey;j) { a[i-k][j]a[i][j]; } } for (int i bx;iex;i) { for(int j by;jey;j) { a[i][j-k]a[i][j]; } } for (int i bx;iex;i) { for(int j by;jey;j) { a[i][jk]a[i][j]; } } }代码解释通过传参的数据进行确定因该被复制的位置 由于这是在字符数组里而不是坐标系里面所以往上进行复制的话就是a[i-k][j] a[i][j]其他方位以此类推这样我们的函数部分就完成了接下来就是正常代码部分首先输入规模然后计算我们发现每增加一个等级那么长和宽的长度就乘3这又就是为什么是g g*3;的原因接下来就到了复制环节 首先确定一开始的四个坐标其实一开始就是我们规定的范围的那个中心点四个变量一开始都是同样的坐标中间点也很好确定就是(g-1)/2;不过其实g/2也可以我个人更喜欢第一种。然后在所有的复制进行之前要把整个规定的范围全部先改成点 中心改成 后面进行赋值的时候往外扩散就好了j接着就是进行复制 只用引用我们写好的函数然后接下来一定一定要写数据更新也就是四个方位的更新 经过测验只需要加或减k就能实现四个坐标的移动重新锁定新的范围 k当然也要更新 由于每一次要在左边和右边个复制一遍所以相当于k k*3;这样的话我们的复制部分就做好了 接下来就是正常输出我们赋值好的部分 别忘了要换行整个程序就完成了ψ(∇´)ψ#includeiostream using namespace std; char a[2200][2200]; void bewegen(int bx, int ex, int by, int ey, int k) { for (int i bx;iex;i) { for(int j by;jey;j) { a[ik][j]a[i][j]; } } for (int i bx;iex;i) { for(int j by;jey;j) { a[i-k][j]a[i][j]; } } for (int i bx;iex;i) { for(int j by;jey;j) { a[i][j-k]a[i][j]; } } for (int i bx;iex;i) { for(int j by;jey;j) { a[i][jk]a[i][j]; } } } int main() { int n; cinn; int g 1; int bx, ex, by, ey, k 1; for (int i 0;i n;i) { g g*3; } bx (g-1)/2; ex bx; by bx; ey bx; for (int i 0;i g;i) { for (int j 0;j g;j) { a[i][j] .; } } a[bx][bx] ; for (int i 0;i n;i) { bewegen(bx, ex, by, ey, k); bx bx-k; ex exk; by by-k; ey eyk; k k*3; } for (int i 0;i g;i) { for (int j 0;j g;j) { couta[i][j]; } coutendl; } return 0; }