問題描述:
在乙個8×8西洋棋盤上,有8個皇后,每個皇后佔一格;要求皇后間不會出現相互「攻擊」的現象,即不能有兩個皇后處在同一行、同一列或同一對角線上。問共有多少種不同的方法。
程式:public
void testeightprince()
// 初始化,所有的位置都可以放置乙個皇后
for (int x = 0; x < grids.length; x++)
}int x = 0, y = 0;
for (x = 0; x < 8; x++)
}// 使棋盤所有的位置都可以放置乙個皇后,回到最初始的狀態
public
void enableallpos(boolean grids) }}
/*** 把棋盤的x,y點所對應的行,列,對角線上的值置成不能放皇后
* * @param grids
* @param x
* @param y
*/public
void disablepos(boolean grids, int x, int y)
// 右對角線
int count = 1;
while (x + count <= 7 && y + count <= 7)
count = 1;
while (x - count >= 0 && y - count >= 0)
// 左對角線
count = 1;
while (x - count >= 0 && y + count <= 7)
count = 1;
while (x + count <= 7 && y - count >= 0)
}public
boolean canlay(final
boolean grids, int xpos, int ypos,
int level, string temp)
// system.out.println(" level 到達最大:" + hasemptypos(grids));
return result;
}/**
* 保持當前棋盤現場,複製乙個棋盤供下一步呼叫
*/boolean newgrids = new
boolean[8][8];
for (int x = 0; x < 8; x++)
}disablepos(newgrids, xpos, ypos);
position poses = getemptypos(newgrids, xpos);
if (poses == null || poses[0] == null)
for (int posindex = 0; posindex < poses.length; posindex++)
}return
false;
}private
class position
/*** 取得當前棋盤的下乙個可放皇后位置的點的集合,這個決定了搜尋空間的大小, 下面採用了最大減少搜尋空間的方法,即下乙個可放位置點的結合從上乙個可放
* 位置的下乙個x方向的位移上取得。保證了演算法的效率,如果整個棋盤掃瞄, 效率很低,而且會出現重複的情況。
* * @param grids
* 當前棋盤
* @param prevxpos
* 上乙個可放位置的x的座標
* @return
*/public position getemptypos(boolean grids, int prevxpos) }/*
* for(int x = 0; x < 8; x++) } }
*/return list.toarray(new position[1]);
}public
boolean hasemptypos(boolean grids) }}
return
false;
}
八皇后問題 遞迴
八皇后問題 遞迴 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。8 8的棋盤方格 每一行的某一列上要有乙個皇后 public class eightqueen 左上方 for int i 1 r...
八皇后問題 遞迴
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例.在8x8格的西洋棋上擺放8個皇后,使其不能互相攻擊,即 任意兩個皇后都不能處於同一行,同一列或同一斜線上,問有多少中擺法 92 第乙個皇后先放第一行第一列 第二個皇后放在第二行第一列,然後判斷是否ok,如果不ok,繼續放在第二列,第三列,依...
八皇后問題(遞迴版)
author phinecos since 2008 10 31 class eightqueen 第col列不能有多於1個皇后 for i 0 i maxsize i 對角線不能有多於1個皇后 反對角線 for i row 1 j col 1 i 0 j maxsize i,j for i row...