【题】
晕(选作)
看着这样的“回”形图案你晕吗?
让我们不用数组,来做出它。
输入:
n。正方形的边长
输出:
边长为 n 的数字回形方阵。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 无限制 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 无限制 | 64M | 0 |
测试用例 5 | 以文本方式显示
| 以文本方式显示
| 无限制 | 64M | 0 |
为什么不能用数组实现呢??⊙﹏⊙b 直接计算出来?好吧,暂时没算出了,Coming soon。。。
【代码】
暂时先用数组实现吧,结构很简单,注释写的很清楚,包括走的脚印都打印出来了。。。
#include "stdio.h"
#define MAX 101
int main(int argc, char **argv)
{
int i, j, n = 4;
int arr[MAX][MAX];
int state = 0, num = 0;
int flag_count = 0; //记录当前点的四周有几个点不能走
scanf("%d", &n);
getchar();
//初始化
for (i = 0; i <= n+1; i++)
{
for (j = 0; j <= n+1; j++)
{
//加围墙,-1
if (i == 0 || i == n+1 || j == 0 || j == n+1)
{
arr[i][j] = -1;
continue;
}
arr[i][j] = 0;
}
}
//输出初始化后的矩阵
printf("初始化后的矩阵:\n");
for (i = 0; i <= n+1; i++)
{
for (j = 0; j <= n+1; j++)
{
printf("%3d", arr[i][j]);
}
printf("\n");
}
printf("\n输出脚印:\n");
i = 1; j = 1;
while (1)
{
//如果四个方向都走过了,说明已经结束了
if (flag_count == 4)
{
printf("此点四个方向都走过了,跳出。\n", i, j);
break;
}
//如果碰到已走过的,或者围墙,则退一步。退一步其实是为了改变方向
//其实这个点就是需要改变方向的点
if (arr[i][j] != 0)
{
switch (state)
{
case 0: //当前方向为右,向左退
j--;
break;
case 1: //当前方向为下,向上退
i--;
break;
case 2: //当前方向为左,向右退
j++;
break;
case 3: //当前方向为上,向下退
i++;
break;
}
//改变方向
state = (state + 1) % 4;
flag_count++;
printf("改变方向的点:(%d, %d)\n", i, j, num);
}
else
{
arr[i][j] = ++num;
flag_count = 0;
printf("(%d, %d) = %3d\n", i, j, num);
}
switch (state)
{
case 0: //向右走
j++;
break;
case 1: //向下走
i++;
break;
case 2: //向左走
j--;
break;
case 3: //向上走
i--;
break;
}
}
//输出结果
printf("\n结果:\n");
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
printf("%3d", arr[i][j]);
}
printf("\n");
}
return 0;
}
【运行截图】