您的位置:首页 > 其它

八皇后问题及其优化

2017-05-14 20:58 197 查看
在棋盘上放置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;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  八皇后 优化