本文所展示的小程序是在蛇形矩阵(螺旋式)基础上加以利用编写的一个小程序。
程序描述:一个点从矩阵的边界的一个角开始螺旋式运动到矩阵的中心。
编写目的:因为一个假期过去了,忘记了不少,突然想到就拿它练练手(ps:一个暑假确实忘记了不少东西)。
程序展示:
#include <iostream> #include <windows.h>
using namespace std; //将x作为行,y作为列(便于理解)
//go_Snake()方法将数字(从1递增到100的变化)螺旋式存入二维数组中(将二维数组比作一张二维表就不难理解了)
void go_Snake(int (* &arr)[10], int& Start, int& End, int& i){ if(Start >= End){ //如果当相对的两边界相交时,退出递归 return; } int y = Start; //x开始的位置 int x = Start;//y开始的位置
//开始一个“回”字形的给二维数组递增赋值
//第一个for循环,对“回”字形(二维数组)的上边界赋值 for(; y < End; y++) arr[x][y] = i++; y--;x++; //设置开始对“回”字形右边界进行赋值的x,y的位置
//第二个for循环,对“回”字形(二维数组)的右边界赋值 for(; x < End; x++) arr[x][y] = i++; x--;y--; //设置开始对“回”字形下边界进行赋值的x,y的位置
//第三个for循环,对“回”字形(二维数组)的下边界赋值 for(; y >= Start; y--) arr[x][y] = i++; x--;y++; //设置开始对“回”字形左边界进行赋值的x,y的位置 for(; x > Start; x--) //这里需要注意的是,由于还要继续进行下一个以“回”字形方式对二维数组赋值,x必须从开始行的下一行继续环绕,所以是" x > Start " arr[x][y] = i++; return go_Snake(arr, ++Start, --End, i); //递归 } //打印每一次黑点前进形的矩阵
//至于index的使用,读者自己思考一下就能懂的 void print(int (* &arr)[10], const int& limited, const int& index){ for(int i = 0; i < limited; i++){ for(int j = 0; j < limited; j++){ if(arr[i][j] == index){ cout<<"● "; //可能会出现编码格式的问题,可以换一个字符代替 } else{ cout<<"o "; } } cout<<endl; } } //quanquanrao()方法(程序第二个递归):作用就是清除前一个黑点移动的矩阵图像,刷新打印下一个黑点移动位置的矩阵图像,直到黑点进入矩阵的中心,来实现黑点螺旋
//缩进环绕运动(博主物理运动相关知识欠缺,暂且先这么命名)。
void quanquanrao(int (* &arr)[10], int& limited, int& index){ if(index >= limited*limited){ return; } print(arr, limited, index); if(index < limited*limited - 1){ //保留黑点进入矩阵中心的图形 system("cls"); } return quanquanrao(arr, limited, ++index); } int main() { int (*number)[10] = new int[10][10]; //动态分配堆内存
//由于以上方法都涉及变量的引用,所以现在这里定义了 int i = 1; int Start = 0; int End = 10; int limited = 10; int index = 1; go_Snake(number, Start, End, i); quanquanrao(number, limited, index); cout<<"Finish !!"<<endl; delete[] number; //系统回收动态分配的堆内存 }
//竟然写了第一篇博客了,以后也会经常写了。