八皇后问题及其优化

在棋盘上放置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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值