算法 贪吃蛇

 

 

 

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,

  

posted on 2014-03-25 15:15  wjw334  阅读(256)  评论(0编辑  收藏  举报

导航