JAVA 打印 M*N的螺旋矩阵(递归) 效率低得很

import java.io.*;
import java.util.*;
public class LXM {
    int m;
    int n;
    int jz[][];
    int num;
    LXM()throws IOException{
        Scanner cin = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        while(true){
            m=cin.nextInt();
            n=cin.nextInt();
            if(m==0&&n==0){
                System.out.println("Game over!");
                break;   
            }
            jz = new int [m][n];
            solve();
            for(int i=0;i<m;i++){
                for(int j=0;j<n;j++){
                    System.out.print(jz[i][j]);
                    if(j!=n-1)System.out.print("/t");
                }
                System.out.println();
            }
               
           
        }
       
    }
    void solve(int x,int y,int z){
        jz[x][y]=num;
        num++;
        /*
         *依次递归赋值
         */
        switch(z){
        case 6:
            if(y+1<=n-1&&jz[x][y+1]==0)
            solve(x,y+1,z);
            else
                if(x+1<=m-1&&jz[x+1][y]==0)
                    solve(x+1,y,2);
            break;
        case 2:
            if(x+1<=m-1&&jz[x+1][y]==0)
                solve(x+1,y,z);
                else
                    if(y-1>=0&&jz[x][y-1]==0)
                        solve(x,y-1,4);
                break;
        case 4:
            if(y-1>=0&&jz[x][y-1]==0)
                solve(x,y-1,z);
                else
                    if(x-1>=0&&jz[x-1][y]==0)
                        solve(x-1,y,8);
                break;
        case 8:
            if(x-1>=0&&jz[x-1][y]==0)
                solve(x-1,y,z);
                else
                    if(y+1<=n-1&&jz[x][y+1]==0)
                        solve(x,y+1,6);
                break;
        }
       
    }
    void solve(){
        num=1;
        solve(0,0,6); //逆时针方向 从(0,0)开始右边开始
    }
    public static void main(String[] args) throws IOException{
        new LXM();

    }

}
-----------------------------------------我 分 隔 你 哟 -------------------------------------------------------------------

输入:

5 5

0 0

输出:

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
Game over!

-----------------------------------------我 分 隔 你 哟 -------------------------------------------------------------------

由于使用递归,所以数据不能很大,不然堆栈溢出错误。

建议数据范围在1<=m*n<=6400

由于JAVA 数组定义不能很大 所以也有限制。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值