八皇后问题及其优化

来源:互联网 发布:ubuntu wine安装qq 编辑:程序博客网 时间:2024/06/05 15:18

在棋盘上放置8个皇后,使得它们互不攻击,此时每个皇后的攻击范围为同行同列和同对角线,要求找出所有解,一个很简单的排列组合问题,每行每列每斜列只能有一个皇后

/** * Created by max on 17-5-14. */public class EightQueen {    private static byte[][] map;    static int key = 0;    static byte[] row = new byte[8];    static int[] answer = new int[8];    public static void main(String[] args)    {        map = new byte[8][8];        location(0);    }    public static void location(int column)    {        if (column==8)        {            for (int i = 0 ;i<8;i++)                System.out.print(" " + answer[i]);            System.out.println(" ");            return;        }        for (int i = 0;i<8 ;i++)        {            if (i!= 0)                map[i-1][column] = 0;            if (row[i] == 1)                continue;            row[i] = 1;            answer[column] = i;            if (attack(i,column))            {                location(column+1);            }            if (i==7)                map[7][column] = 0;            row[i] = 0;        }    }    public static boolean attack(int x,int y)    {        int i = 0;        while(x+i<8&&y+i<8)        {            if (map[x+i][y+i] ==1)            {                return false;            }            i++;        }        i = 0;        while(x-i>=0&&y-i>=0)        {            if (map[x-i][y-i] == 1)            {                return false;            }            i++;        }        i = 0;        while (x-i>=0&&y+i<8)        {            if (map[x-i][y+i] == 1)            {                return false;            }            i++;        }        i = 0;        while (x+i<8&&y-i>=0)        {            if (map[x+i][y-i] == 1)            {                return false;            }            i++;        }        i = 0;        while(i<8)        {            if (map[x][i]==1||map[i][y]==1)            {                return false;            }            i++;        }        map[x][y] = 1;        return true;    }}

优化后

/** * Created by max on 17-5-14. */public class EightQueenBetter {    static int row[] = new int[8];    public static void main(String[] args)    {        search(0);    }     static void search(int row_number)     {         if (row_number == 8) {             for (int i = 0 ;i<8;i++)                 System.out.print(" "+row[i]);             System.out.println("");             return;         }         for (int i =0 ;i<8;i++)         {             boolean ok = true;             row[row_number] = i;             for (int j = 0 ;j<row_number;j++)             {                 if (row[row_number]==row[j]||row_number-row[row_number]==j-row[j]||row_number+row[row_number]==j+row[j])                 {                     ok = false;                     break;                 }             }             if (ok)                 search(row_number+1);         }     }}

在优化

  private static byte[][] accupied = new byte[3][15];     static void search2(int column)     {         if (column==8) {             showAnswer();             return;         }         for (int i = 0;i<8;i++)         {             if (accupied[0][i]==0&&accupied[1][column+i]==0&&accupied[2][7-column+i]==0)             {                 row[column] = i;                 accupied[0][i]=1;                 accupied[1][column+i]=1;                 accupied[2][7-column+i]=1;                 search2(column+1);                 accupied[0][i]=0;                 accupied[1][column+i]=0;                 accupied[2][7-column+i]=0;             }         }     }
0 0
原创粉丝点击