- 以下是任意维度数量小于等于100的二维数组的螺旋矩阵的输出实现
- 如果要是实现任意数组,要使用动态分配数组。
- 实现复杂的原因是要判断最后一个位置之后不能再有空格,否则很容易实现
输入:维度和值
输出:螺旋输出,空格分隔,最后一个输出后没有空格
#include <stdio.h>
int main() {
int matrix[100][100];
int m;
int n;
//input 输入几行几列
scanf("%d%d", &m, &n);
//维数组赋值
for(int i = 0; i < m; ++i) {
for(int j = 0; j < n; ++j) {
scanf("%d", &matrix[i][j]);
}
}
//output
int vmin = 0; //最上行的下标
int vmax = m-1; //最下行的下标
int hmin = 0; //最左行的下标
int hmax = n-1; //最又行的下标
/*分类讨论:
仅有一行
仅有一列
方阵 m == n
m > n
m < n*/
if(m == 1) { //一行
for(int i = 0; i < n; i++){
printf("%d",matrix[m-1][i]);
if(i != n-1) printf(" ");
}
}else if( n == 1){ //一列
for(int i = 0; i < m; i++) {
printf("%d", matrix[i][0]);
if(i != m - 1) printf(" ");
}
}else if(n == m) { //奇偶一致
while(vmin <= vmax || hmin <= hmax){ //若有一个min > max则停止
//里面有四个步骤,向右,向下,向左,向上。
for(int i = hmin; i <= hmax; ++i) {
printf("%d", matrix[vmin][i]);
//只有当其不是两者同时相等,才输出空格;否则意味着到了最后
if((hmin != hmax || vmin != vmax)) printf(" ");
}
++vmin;
for(int i = vmin; i <= vmax; ++i) {
printf("%d",matrix[i][hmax]);
if((hmin != hmax || vmin != vmax)) printf(" ");
}
--hmax;
for(int i = hmax; i >= hmin; --i) {
printf("%d",matrix[vmax][i]);
if((hmin != hmax || vmin != vmax)) printf(" ");
}
--vmax;
for(int i = vmax; i >= vmin ; --i) {
printf("%d", matrix[i][hmin]);
if((hmin != hmax || vmin != vmax)) printf(" ");
}
++hmin;
}
}else if(m > n) { // m > n
//行数多,意味着,最后一定是列
int flag = 0; //当到了最后一列的输出,更新
int quit = 0; //如果输出完最后一列,退出whille循环
while(vmin <= vmax || hmin <= hmax){
for(int i = hmin; i <= hmax; ++i) {
printf("%d", matrix[vmin][i]);
if(flag == 1 && i == hmax) { //说明输出完了最后一个,break;
quit = 1; //设置标志位
break;
}else {
printf(" "); //没输出完,空格
}
}
if(quit) break; //退出整个循环
//如果有一对相同同时没有改过flag,更改flag
if((hmin == hmax || vmin == vmax) && flag == 0) { flag = 1; }
++vmin;
for(int i = vmin; i <= vmax; ++i) {
printf("%d",matrix[i][hmax]);
if(flag == 1 && i == vmax) {
quit = 1;
break;
}else {
printf(" ");
}
}
if(quit) break;
if((hmin == hmax || vmin == vmax) && flag == 0) { flag = 1; }
--hmax;
for(int i = hmax; i >= hmin; --i) {
printf("%d",matrix[vmax][i]);
if(flag == 1 && i == hmin) {
quit = 1;
break;
}else {
printf(" ");
}
}
if(quit) break;
if((hmin == hmax || vmin == vmax) && flag == 0) { flag = 1; }
--vmax;
for(int i = vmax; i >= vmin ; --i) {
printf("%d", matrix[i][hmin]);
if(flag == 1 && i == vmin) {
quit = 1;
break;
}else {
printf(" ");
}
}
if(quit) break;
if((hmin == hmax || vmin == vmax) && flag == 0) { flag = 1; }
++hmin;
}
}else { // m < n
//列数多,最后一定是行,分析同上。
int flag = 0;
int quit = 0;
while(vmin <= vmax || hmin <= hmax){
for(int i = hmin; i <= hmax; ++i) {
printf("%d", matrix[vmin][i]);
if(flag == 1 && i == hmax) {
quit = 1;
break;
}else {
printf(" ");
}
}
if(quit) break;
if((hmin == hmax || vmin == vmax) && flag == 0) { flag = 1; }
++vmin;
for(int i = vmin; i <= vmax; ++i) {
printf("%d",matrix[i][hmax]);
if(flag == 1 && i == vmax) {
quit = 1;
break;
}else {
printf(" ");
}
}
if(quit) break;
if((hmin == hmax || vmin == vmax) && flag == 0) { flag = 1; }
--hmax;
for(int i = hmax; i >= hmin; --i) {
printf("%d",matrix[vmax][i]);
if(flag == 1 && i ==hmin) {
quit = 1;
break;
}else {
printf(" ");
}
}
if(quit) break;
if((hmin == hmax || vmin == vmax) && flag == 0) { flag = 1; }
--vmax;
for(int i = vmax; i >= vmin ; --i) {
printf("%d", matrix[i][hmin]);
if(flag == 1 && i == vmin) {
quit = 1;
break;
}else {
printf(" ");
}
}
if(quit) break;
if((hmin == hmax || vmin == vmax) && flag == 0) { flag = 1; }
++hmin;
}
}
return 0;
}