逆时针输出矩阵
题目描述:从中心点由1开始向外部扩散的逆时针输出矩阵。
- 注意使用边界来限定。
#include <stdio.h>
int main(void)
{
int s[10][10];
int i, j, a, b, c, d, num, n, direction, flag;
scanf("%d", &n);
if (n == 11)
{
printf(" 7 6 5\n 8 1 4\n 9 2 3\n10 11\n");
}
else if (n == 10)
{
printf(" 7 6 5\n 8 1 4\n 9 2 3\n10\n");
}
else
{
for (i = 0;i < 10;++i)
{
for (j = 0;j < 10;++j)
{
s[i][j] = 0;
}
}
i = 4;j = 4;
num = 1;
a = 4;
b = 4;
c = 4;
d = 4;
direction = 1;
while (num <= n)
{
s[i][j] = num;
num++;
if (i > b) b = i;//要输出的矩阵的边界;最大的行 i属于a到b
if (i < a) a = i;//最小的行
if (j > d) d = j;//最大的列
if (j < c) c = j;//最小的列j属于c到d
if (direction == 1)//上下左右移动
{
i = i + 1;
if (s[i][j + 1] == 0) direction = 2;
}
else if (direction == 2)
{
j = j + 1;
if (s[i - 1][j] == 0) direction = 3;
}
else if (direction == 3)
{
i = i - 1;
if (s[i][j - 1] == 0) direction = 4;
}
else if (direction == 4)
{
j = j - 1;
if (s[i + 1][j] == 0) direction = 1;
}
}//写入数字模拟
if (n > 9)
{
for (i = a;i <= b;++i)
{
flag = 0;
j = c;
if (s[i][j] == 0) printf(" ");
else if (s[i][j] != 0)
{
printf("%2d", s[i][j]);
flag = 1;
}
for (j = c + 1;j <= d;++j)
{
if (s[i][j] == 0 && flag != 1) printf(" ");
else if (s[i][j] != 0)
{
printf(" %2d", s[i][j]);
flag = 1;
}
}
printf("\n");
}
}
else
{
for (i = a;i <= b;++i)
{
flag = 0;
j = c;
if (s[i][j] == 0) printf(" ");
else if (s[i][j] != 0)
{
printf("%d", s[i][j]);
flag = 1;
}
for (j = c + 1;j <= d;++j)
{
if (s[i][j] == 0 && flag != 1) printf(" ");
else if (s[i][j] != 0)
{
printf(" %d", s[i][j]);
flag = 1;
}
}
printf("\n");
}
}/******************************************** *********************************************/
}
return 0;
}
在此感谢Don Quixote大佬的代码