解题思路:
围墙法,或者叫设限法,定义二维数组时多一圈,并把多出的一圈赋值为 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分
2 人评分
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:524 |
A+B for Input-Output Practice (IV) (C语言代码)浏览:513 |
剪刀石头布 (C++代码)浏览:1811 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:644 |
C二级辅导-统计字符 (C语言代码)浏览:514 |
淘淘的名单 (C语言代码)浏览:1309 |
C语言程序设计教程(第三版)课后习题6.8 (C语言代码)浏览:653 |
简单的a+b (C语言代码)浏览:491 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:604 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:827 |