算法 贪吃蛇
package com.test; public class LittleMaSuanFa { class Holder { int n; int hang; int lie; public Holder(int n, int hang, int lie) { this.n = n; this.hang = hang; this.lie = lie; } } /*** * 从左到右遍历 * * @param num * 将要赋值的num * @param array * @param Lhang * 总行数 * @param Llie * 总列数 * @param startHang * 请求节点行数 * @param startLie * 请求节点列数 * @return */ private Holder SetNumLeftToRight(int num, int[][] array, int Lhang, int Llie, int startHang, int startLie) { if (startHang >= Lhang || startLie >= Llie) { return null; } if (startLie + 1 < Llie) { if (array[startHang][startLie + 1] != 0) { return null; } } int i; for (i = startLie + 1; i < Llie; i++) { if (array[startHang][i] != 0) { return new Holder(num - 1, startHang, i - 1); } array[startHang][i] = num++; } return new Holder(num - 1, startHang, i - 1); } /** * 从上到下遍历 * * @param args */ private Holder SetNumUpToDown(int num, int[][] array, int Lhang, int Llie, int startHang, int startLie) { if (startHang >= Lhang || startLie >= Llie) { return null; } if (startHang + 1 < Lhang) { if (array[startHang + 1][startLie] != 0) { return null; } } int i = 0; for (i = startHang + 1; i < Lhang; i++) { if (array[i][startLie] != 0) { return new Holder(num - 1, i - 1, startLie); } array[i][startLie] = num++; } return new Holder(num - 1, i - 1, startLie); } /** * 从右到左遍历 * * @param args */ private Holder SetNumRightToLeft(int num, int[][] array, int Lhang, int Llie, int startHang, int startLie) { if (startHang >= Lhang || startLie >= Llie) { return null; } if (startLie - 1 >= 0) { if (array[startHang][startLie - 1] != 0) { return null; } } int i = 0; for (i = startLie - 1; i >= 0; i--) { if (array[startHang][i] != 0) { return new Holder(num - 1, startHang, i + 1); } array[startHang][i] = num++; } return new Holder(num - 1, startHang, i + 1); } /** * 从下到上 * * @param args */ private Holder SetNumDownToUp(int num, int[][] array, int Lhang, int Llie, int startHang, int startLie) { if (startHang >= Lhang || startLie >= Llie) { return null; } if (startHang - 1 >= 0) { if (array[startHang - 1][startLie] != 0) { return null; } } int i = 0; for (i = startHang - 1; i >= 0; i--) { if (array[i][startLie] != 0) { return new Holder(num - 1, i + 1, startLie); } array[i][startLie] = num++; } return new Holder(num - 1, i + 1, startLie); } public void print(int[][] array, int hang, int lie) { for (int i = 0; i < hang; i++) { String str = ""; for (int j = 0; j < lie; j++) { str = str + array[i][j] + ","; } System.out.println(str); } } public void fuzhi(int[][] array, int Lhang, int Llie, Holder holder) { holder = SetNumLeftToRight(holder.n + 1, array, Lhang, Llie, holder.hang, holder.lie); if (holder != null) { holder = SetNumUpToDown(holder.n + 1, array, Lhang, Llie, holder.hang, holder.lie); } else { return; } if (holder != null) { holder = SetNumRightToLeft(holder.n + 1, array, Lhang, Llie, holder.hang, holder.lie); } else { return; } if (holder != null) { holder = SetNumDownToUp(holder.n + 1, array, Lhang, Llie, holder.hang, holder.lie); } else { return; } if (holder != null) { fuzhi(array, Lhang, Llie, holder); } else { return; } } public void FuzhiFun(int hang, int lie) { int[][] array = new int[hang][lie]; array[0][0] = 1; Holder holder = new Holder(1, 0, 0); fuzhi(array, hang, lie, holder); print(array, hang, lie); } int[][] array = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; public static void main(String[] args) { LittleMaSuanFa li = new LittleMaSuanFa(); li.FuzhiFun(5, 4); } }
1,2,3,4, 14,15,16,5, 13,20,17,6, 12,19,18,7, 11,10,9,8,