回型输入和回型输出
输入m,n,输出一个m*n的回型(顺时针方向)矩阵,再回型(逆时针方向)输出
对于是顺时针输入还是逆时针输入,只需要更改初始x,y值就行。顺时针:x=0,y=-1;逆时针:x=-1,y=0即可。
至于为什么是-1,是因为为了编程的方便以及避免自加后越界导致需要减回边界
这里使用的是循环较为方便,经过分析发现也可使用递归,一个大矩阵里面包含了小矩阵,递归式大致为f(大)=f(小)+小的外围边框。
#include <cstring>
#include <iostream>
using namespace std;
int main()
{
int m, n;
int a[20][20]; //大小可依照题目改动
memset(a, -1, sizeof(a)); //先把所有数据初始化为-1
int tot = 1, x = 0, y = -1; //先从左往右,顺时针,所以x从0开始,y从-1开始
cin>>m>>n; //输入行列
while(tot <= m * n)
{
while(y+1 < n && a[x][y+1] == -1) //从左到右 终止条件为到边界同时未写如数据
a[x][++y]=tot++;
while(x+1 < m && a[x+1 ][y] == -1) //从上到下
a[++x][y]=tot++;
while(y-1 >= 0 && a[x][y-1] == -1) //从右到左
a[x][--y]=tot++;
while(x-1 >= 0 && a[x-1 ][y] == -1) //从下到上
a[--x][y]=tot++;
}
//此时打印上面的回型顺时针输入
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
//此时x,y在回型中间,将其置于-1,0用作 逆时针输出
x = -1;
y = 0;
while(tot >1)
{
while(x + 1 < m && a[x + 1][y] != -1) //从上到下
{
cout<<a[++x][y]<<" ";
a[x][y] = -1; //输出后将其置为-1,表示已经输出过
tot--;
}
cout<<endl;
while(y + 1 < n && a[x][y + 1] != -1) //从左到右
{
cout<<a[x][++y]<<" ";
a[x][y] = -1;
tot--;
}
cout<<endl;
while(x - 1 >= 0 && a[x - 1][y] != -1) //从下到上
{
cout<<a[--x][y]<<" ";
a[x][y] = -1;
tot--;
}
cout<<endl;
while(y - 1 >= 0 && a[x][y - 1] != -1) //从右到左
{
cout<<a[x][--y]<<" ";
a[x][y] = -1;
tot--;
}
cout<<endl;
}
return 0;
}