思路
整体可以分为四个状态,如果按照当前状态行进,下一个块如果不合法,或者已经被走过,则转向。只需要对(2,1)块特判下即可(可以自己模拟一下试试)。
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
static int n ;
static int m ;
static boolean[][] vis;
static boolean check(int x, int y) {
return x >= 1 && x <= n && y >= 1 && y <= m;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (true) {
n = in.nextInt();
m = in.nextInt();
if (n == -1)
break;
int[][] map = new int[n + 1][m + 1];
vis = new boolean[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1 ; j <= m; j++) {
map[i][j] = in.nextInt();
}
}
int now = 0;
int i = 1;
int j = 1;
int status = 1;
while (now < n * m) {
now ++;
vis[i][j] = true;
if (now == n * m) {
System.out.print(map[i][j]);
} else {
System.out.print(map[i][j] + ",");
}
if (status == 1) {
if (!check(i, j + 1) || vis[i][j + 1]) {
status = 2;
i ++;
} else {
j ++;
}
} else if (status == 2) {
if (!check(i + 1, j) || vis[i + 1][j]) {
status = 3;
j--;
} else {
i++;
}
} else if (status == 3) {
if (!check(i, j - 1) || vis[i][j - 1]) {
status = 4;
i--;
} else {
j--;
}
} else if (status == 4) {
if (!check(i - 1, j ) || vis[i - 1][j ]) {
status = 1;
j++;
} else {
i--;
}
}
}
System.out.println();
}
}
}

京公网安备 11010502036488号