当前位置: 代码迷 >> J2SE >> 小白第一回发帖,遇难题 求解救
  详细解决方案

小白第一回发帖,遇难题 求解救

热度:97   发布时间:2016-04-23 20:04:52.0
小白第一次发帖,遇难题 求解救
求大神解救,谢谢

------解决思路----------------------
//再给一次代格式

/**
 * @author qzw
 */
public class MultiMatrix {
public static void main(String args[]){
    //逆时针输出回形矩阵图
    int[][] arr = getArray(4,4);
    for(int i=0;i<arr.length;i++){
        for(int j=0;j<arr[i].length;j++){
            //System.out.print(arr[i][j]+",");
            System.out.printf("%03d",arr[i][j]);
            System.out.print("\t");
        }
        System.out.println();
    }
}
/**
 * 获取xInt * yInt逆时针回形矩阵数组
 * @param xInt,矩阵x轴大小
 * @param yInt,矩阵y轴大小
 * @return
 */
public static int[][] getArray(int xInt, int yInt){
    int xMax = xInt;
    int yMax = yInt;
    int n = 4;
    int arr[][]=new int[yMax][xMax];
    int x = 0, y = 0;
    int xMin = 0, yMin = 0;
    int size = xMax * yMax;
    boolean flag = true;
    for(int i=0;i<size;i++){
        arr[x][y] = i+1;
        if((y+1)<yMax && flag){
            y++;
        }else if((x+1)<xMax && flag){
            x++;
        }else {
            if(y>yMin){
                y--;
            }else if(x>(xMin+1)){
                x--;
            }else{
                xMax--;
                yMax--;
                xMin++;
                yMin++;
                y++;
                flag = true;
            }
        }
        if((y+1) == yMax && (x+1) == xMax){
            flag = false;
        }
    }
    return arr;
}
}



------解决思路----------------------
其实不是很难!

首先你要明白题意:
1、输入n后,创建一个n*n的二维数组,将1到n*n这些数字填如数组。
2、当然1填入的数组的下标为(0,0)接着下一个数字呐?所以要定义一个参数方向
具体代码:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Test {
public static void main(String[] args) throws Exception {
String line="";
while(line!=null&&!"q".equalsIgnoreCase(line)){
System.out.println("请输入大于零的数字(输入q退出)");
Scanner sc=new Scanner(System.in);
line=sc.nextLine();
if(line!=null&&line.matches("\\d++")){
int n=Integer.parseInt(line);
int[][] ints=FillNumber(n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(ints[i][j]+"\t");
}
System.out.println();
}
}
}

}

private static int[][] FillNumber(int n) {
int[][] ints=new int[n][n];
int x=0;
int y=0;
int direction=0;
Set<String> used=new HashSet<String>();
for(int num=1;num<=n*n;num++){
// System.out.println("("+x+","+y+")="+num);
ints[x][y]=num;
direction=nextDirection(x,y,direction,n,used);
x=nextX(x,direction,n);
y=nextY(y,direction,n);
}
return ints;
}
private static int nextY(int y, int direction,int n) {
if(direction==0){
return y+1;
}else if(direction==2){
return y-1;
}else{
return y;
}
}

private static int nextX(int x, int direction,int n) {
if(direction==1){
return x+1;
}else if(direction==3){
return x-1;
}else{
return x;
}
}

/**
 * 确定下一个数的方向,0 y+1;1 x+1;2 y-1; 3 x-1 
 * @param x 
 * @param y
 * @param direction 下一个数填充的方向
 * @param n 边界
 * @return
 */
private static int nextDirection(int x, int y, int direction, int n,Set<String> used) {
used.add(x+","+y);
boolean changeDirection=false;
int x2=nextX(x,direction,n);
if(x2<0
------解决思路----------------------
x2>=n){
changeDirection=true;
}
int y2=nextY(y,direction,n);
if(y2<0
------解决思路----------------------
y2>=n){
changeDirection=true;
}
String xy2=x2+","+y2;
if(used.contains(xy2)){
changeDirection=true;
}
if(changeDirection){
return (direction+1)%4;
}else{
return direction;
}
}

}

  相关解决方案