现在的位置: 首页 > 综合 > 正文

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

2013年10月12日 ⁄ 综合 ⁄ 共 2119字 ⁄ 字号 评论关闭

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 数组定义不能很大 所以也有限制。

 

抱歉!评论已关闭.