本帖最后由 strawberry2013 于 2013-5-2 09:32 编辑
- 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;
- }
- }
复制代码 |