原题链接:蓝桥杯基础练习VIP-回形取数
解题思路:
围墙法,或者叫设限法,定义二维数组时多一圈,并把多出的一圈赋值为 2147483647 (整型的最大值)
同样的,把已经输出的数也赋值为 2147483647 , 作为界限
当已输出的个数小于 m * n 且当前方向下一个数不为 2147483647 时,循环输出即可
参考代码:
#include <stdio.h>
int main()
{
int m, n;
scanf("%d %d", &m, &n);
int a[m + 2][n + 2]; //定义时多出两行两列,即多一圈
for (int i = 0; i <= m + 1; i++)
{
for (int j = 0; j <= n + 1; j++)
{
if (i == 0 || i == m + 1 || j == 0 || j == n + 1) //判断是否为最外层
a[i][j] = 2147483647; //是则赋值2147483647
else
scanf("%d", &a[i][j]); //否,则输入
}
}
if (m && n)
printf("%d", a[1][1]); //为避免结尾空格,先输出a[1][1]
a[1][1] = 2147483647; //已输出的数赋值为2147483647
int x = 1, y = 1, count = 1; //定义x为行下标,y为列下标,初始化为1
while (count < m * n) //count表示已输出的个数
{
while (a[x + 1][y] != 2147483647 && ++count) //若下方非界限,则行向下,count+1
{
printf(" %d", a[++x][y]); //此处x先自加再输出
a[x][y] = 2147483647;
}
while (a[x][y + 1] != 2147483647 && ++count) //若右方非界限,则列向右,count+1
{
printf(" %d", a[x][++y]); //此处y先自加再输出
a[x][y] = 2147483647;
}
while (a[x - 1][y] != 2147483647 && ++count) //若上方非界限,则行向上,count+1
{
printf(" %d", a[--x][y]); //此处x先自减再输出
a[x][y] = 2147483647;
}
while (a[x][y - 1] != 2147483647 && ++count) //若左方非界限,则列向左,count+1
{
printf(" %d", a[x][--y]); //此处y先自减再输出
a[x][y] = 2147483647;
}
}
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复