本文所展示的小程序是在蛇形矩阵(螺旋式)基础上加以利用编写的一个小程序。
程序描述:一个点从矩阵的边界的一个角开始螺旋式运动到矩阵的中心。
编写目的:因为一个假期过去了,忘记了不少,突然想到就拿它练练手(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; //系统回收动态分配的堆内存
}
//竟然写了第一篇博客了,以后也会经常写了。