八皇后问题

来源:互联网 发布:arm7也是keil编程吗 编辑:程序博客网 时间:2024/06/03 20:14
package javatask;public class EightQueenO {private int[][]map;private int len;private int[]C;private int tol;public static void main(String[] args) {new EightQueenO().run();}public EightQueenO() {len = 8;C = new int[len];//记录当前行可放置的列tol = 0;}public void run() {search(0);System.out.println("total = " + tol);}public boolean isOk(int row, int col) {for(int j = 0; j < row; j++ ) {if(C[j] == col || C[j]+ j == col+row || C[j]-j == col-row) {//只需要判断当前行以前的对角线和列即可return false;}}return true;}public void search(int cur) {if(cur == len) {tol++;//只有到达 这里时候 才是完成了 八皇后 for(int i = 0; i < len; i++ ) {for(int j = 0; j < len; j++ ) {if(C[i] == j)System.out.print(1+" ");elseSystem.out.print(0 +" ");}System.out.println();}System.out.println("***************");}else {for(int i = 0; i < len; i++ ) {C[cur] = i;//这里保证了 最终的值一定是构成8皇后时候的值(因为其值不断被修改直到完成所有行)if(isOk(cur, i)) {//map[cur][i] = 1;//有的不能构成八皇后但是仍然 在末尾之前的位置满足 也被记录了search(cur+1);//所以用map记录是错误的}}}//for(int i = 0; i < len; i++ ) {//int ok = 1;//C[cur] = i;//for(int j = 0; j < cur; j++ ) {//if(C[j] == C[cur]|| C[j]+ j == C[cur]+cur || C[j]-j == C[cur]-cur) {//ok = 0; break;//}//}//if(ok == 1) search(cur+1);//}}}
中间的dfs部分可以换成   
for(int i = 0; i < len; i++ ) {    if(isOk(cur, i)) {     vis[cur] = i;     search(cur+1);     vis[cur] = 0;//保证 只有成功的时候才会被记录 然后 输出后 立刻 清零    }   }