#include<stdio.h> int 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; } /************************************************************** Problem: 1840 User: admin Language: C Result: Accepted Time:86 ms Memory:1180 kb ****************************************************************/