//非递归求解八皇后,回溯算法
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int d[8] = {-1,-1,-1,-1,-1,-1,-1,-1};//记录棋盘位置
int IFOK(int column, int row){//判断新增加的皇后是否与之前的皇后碰头,若是则返回0,否则返回1
if(column == 0) return 1;
int i;
for (i = 0; i < column; i++){
if (d[i] == row || abs(d[i] - row) == abs(i - column)) return 0;
}
return 1;
}
int main(){
int i = 0; int j = 0;int count = 0;
while (i < 8 && i >= 0) {
while(j < 8 && j >= 0){
d[i] = j;
if (IFOK(i, j) == 1) break;//第i列第j行增加的皇后不会跟第i列之前放置的皇后碰头
else {//(i,j)这个位置不能放皇后,考虑(i,j+1)这个位置
d[i] = -1;
j ++;
}
}
if(j != 8) {//第i列能够找到一个位置放置皇后跟第i列之前放置的皇后都不碰头
if(i == 7){//如果是最后一列找到这样的一个位置,说明已经找到一个完整的八皇后排布
int k;
printf("answer %d \n", ++count);//打印结果
for (k = 0; k < 8; k ++){
printf("(%d, %d) \n", k, d[k]);
}
j = 8;//令j等于8,这样可以进入下面的while循环,回溯后继续查找其它的排布
}
else {//如果不是最后一列,那么我们继续在下一列找能放皇后的位置
i++;
j = 0;
}
}
while (j == 8){//如果第i列没有找到能放皇后的位置,则回溯到上一列刚才放置皇后的下一行,继续查找,这里注意必须用while而不是if,因为可能上一列把皇后放在第7行,if语句中j = d[i]+1得到8,然后跳出了while(j < 8 && j >= 0)这个循环,并永远跳不出最外层的循环了。
i --;
j = d[i]+1;
}
}
}
Eight Queen, non-recursive
最新推荐文章于 2015-01-26 17:42:25 发布