本文共 1705 字,大约阅读时间需要 5 分钟。
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。 输出格式 输出只有一行,共m×n个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。 例子 输入3 3
1 2 3 4 5 6 7 8 9 输出1 4 7 8 9 6 3 2 5
输入3 2
1 2 3 4 5 6 输出1 3 5 6 4 2
很关键的就是对边界的判断,用循环逐个方向进行遍历,并对判断过的数进行标记。
代码呈上:
#includeint down(int a[200][200], int i, int j,int m) { //方向向下判断 if (i < m - 1) { if (a[i + 1][j] == -1) //如果下一个数据已经去过 return 0; else return 1; } else if (i == m - 1) //如果到达数组边界 return 0; else return 1;}int right(int a[200][200], int i, int j, int n) { if (j == n - 1) return 0; else if (j < n) { if (a[i][j + 1] == -1) return 0; else return 1; }}int up(int a[200][200], int i, int j) { if (i == 0) return 0; else if (a[i - 1][j] == -1) return 0; else return 1;}int left(int a[200][200], int i, int j) { if (j == 0) return 0; else if (a[i][j - 1] == -1) return 0; else return 1;}int main() { int a[200][200]; int i, j; int m, n; scanf("%d%d", &m, &n); for (i = 0; i < m; i++) for (j = 0; j < n; j++) scanf("%d", &a[i][j]); i = 0; j = 0; while (m!=1 || n!=1) { for (; down(a, i, j, m); i++) { printf("%d ", a[i][j]); a[i][j] = -1;//将去过的数据设置标记即-1 } if (a[i][j + 1] == -1) break; for (; right(a, i, j, n); j++) { printf("%d ", a[i][j]); a[i][j] = -1; } if (a[i - 1][j] == -1) break; for (; up(a, i, j); i--) { printf("%d ", a[i][j]); a[i][j] = -1; } if (a[i][j - 1] == -1) break; for (; left(a, i, j); j--) { printf("%d ", a[i][j]); a[i][j] = -1; } if (a[i + 1][j] == -1) break; } printf("%d", a[i][j]); return 0;}
代码很简单,只是略显繁琐,并且细节很容易出错。
运行示例
转载地址:http://znrzi.baihongyu.com/