Java_对数据外螺旋方式排列

本博客为子墨原创,转载请注明出处!
http://blog.csdn.net/zimo2013/article/details/8875583
打印一个带星号(*)的二维数组
要求:从自然数1开始,从里向外螺旋方式排列,并在最外层包上一层星号

例如:输入n=3

Java_对数据外螺旋方式排列_第1张图片

输入n=4:

Java_对数据外螺旋方式排列_第2张图片Java_对数据外螺旋方式排列_第3张图片

/*
	昨天下午写了很长时间都没有写好,主要还是思路混乱。睡觉的时候思路才慢慢清晰,今天测试才符合要求!
	Strawberry2013-5-2
*/
import javax.swing.JOptionPane;	

class Demo
{
	private static int MAX_N = 10;//支持最大自然数为20
	public static void main(String[] args)
	{
		int[][] val = new int[MAX_N][MAX_N];	
		int n = getNumber("请输入自然数N");//获取自然数N

		if(n<=MAX_N && n>=1)				//判断自然数N的有效范围
		{
			if(n%2 == 1)	
				exec(val, 0, n-1, n);
			else
				exec(val, n-1, 0, n);
		}
		show(val, n);
	}

	public static void exec(int[][] val, int m, int n, int len)
	{
		int i, key;			//exec(val, m, n, len) ->m,n分别代表目标点的横纵坐标 len表示该目标运动的长度;

		if (len%2 == 0)
			key = 1;		//判断运动的方向 key=1表示向右或者向上 key=-1表示相反方向
		else
			key = -1;

		for(i=0; i <= len-1; i++)
		{
			val[m][n+key*i] = len*len - i;
		}
		int temp = val[m][n+key*(len-1)];	//存储拐点的val值
		for(i=0; i<=len-1; i++)
		{
			val[m-key*i][n+key*(len-1)] = temp - i;
		}
		if (len == 1)
			return;
		exec(val, m-key*(len-1), n+key*(len-2), len-1);
	}

	public static void show(int[][] val, int n)//打印信息
	{
		for(int i=0; i<n; i++)
		{
			for(int j=0; j<n; j++)
			{
				if(val[i][j] != 0)
				System.out.print(val[i][j]+"\t");
			}
			System.out.println("\n");
		}
	}
	public static int getNumber(String message)//获取自然数n值
	{
		int number = 0;
		String str = JOptionPane.showInputDialog(null, message, "提示",JOptionPane.INFORMATION_MESSAGE);
		try
		{
			number = Integer.parseInt(str); // 得到输入的正整数
		}
		catch( Exception e)
		{
			JOptionPane.showMessageDialog(null, "输入非数字字符\n程序结束", "错误警告", JOptionPane.ERROR_MESSAGE);
			return -1; // 输入的不是数字字符,程序结束
		}
		if (number < 1 || number > MAX_N)
		{
			JOptionPane.showMessageDialog(null, "自然数N范围为:1-"+MAX_N+"\n程序结束", "错误警告",JOptionPane.ERROR_MESSAGE);
			return -1; // 输入的数不在范围,程序结束
		 }
		 else
			 return number;
	}

}


你可能感兴趣的:(Java_对数据外螺旋方式排列)