用类似树的深度搜索,走完一步,去搜索可走的下一步。注释很详细,不详解了。
- public class Test99 {
- public static void main(String[] args) {
- Test99 test = new Test99();
- //从键盘接收一个数,动态确定数组大小
- System.out.println("请输入一个数,来作为您的二位数组长度:");
- Scanner sc = new Scanner(System.in);
- int chang = sc.nextInt();
- System.out.println("请输入一个数,来作为您的二位数组宽度:");
- int kuan = sc.nextInt();
- int[][] arr = new int[chang][kuan];
- //数组初始值都设置为0,代表每一位还没有被访问过。
- for(int i=0;i<chang;i++){
- for(int j=0;j<kuan;j++)
- arr[i][j] = 0;
- }
-
- /*观察得数字运动路线为:右,下,左,上。所有定义变量来记录上一个数字运动方向。
- 右:1 下:2 左:3 上:4 .第一步肯定往右,所有move初始值为1.
- */
- int move =1;
- int step =0;//记录步数
- int i=0,j=0;//初始位置
-
- while(step < chang*kuan){
- move = test.printArr(arr, i, j, move, chang,kuan);
- switch(move){
- case 1:
- arr[i][j++] = ++step;
- break;
- case 2:
- arr[i++][j] = ++step;
- break;
- case 3:
- arr[i][j--] = ++step;
- break;
- case 4:
- arr[i--][j] = ++step;
- break;
- case -1:
- break;
- }
- }
-
- //输出数组
- for(int m=0;m<chang;m++){
- for(int n=0;n<kuan;n++){
- System.out.print(arr[m][n]+" ");
- }
- System.out.println("");
- }
- }
-
- //根据上一步的运动,以及边界条件来判断下一步该往哪个方向运动
- public int printArr(int[][]arr,int i,int j,int move,int chang,int kuan){
- //如果上一步是向右走,则判断该位置右侧是否已被访问或已达边界,是返回2,指示下一步向下走,否则返回1继续向右走
- if(move == 1){
- if((j+1)>=kuan || arr[i][j+1] !=0){
- return 2;
- }
- else return 1;
- }
- //如果上一步向下走,则判断该位置下面位置是否已被访问或已达边界,是返回3,指示下一步向左走,否返回2继续下走。
- else if(move == 2){
- if((i+1)>=chang || arr[i+1][j] != 0){
- return 3;
- }
- else return 2;
- }
- //如果上一步向左走,则判断该位置左侧位置是否已被访问或已达边界,是返回4,指示下一步向上走,否返回3继续左走。
- else if(move == 3){
- if(j<=0 || arr[i][j-1] != 0){
- return 4;
- }
- else return 3;
- }
- //如果上一步向上走,则判断该位置上面位置是否已被访问或已达边界,是返回1,指示下一步向右走,否返回4继续向上走。
- else if(move == 4){
- if(i<=0 || arr[i-1][j] != 0){
- return 1;
- }
- else return 4;
- }
- return -1;
-
- }
- }
复制代码 |