题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。
[img]http://dl.iteye.com/upload/picture/pic/94902/133043c3-9957-3c21-a5e0-4bf77c4d3f44.jpg[/img]
从第一行开始放皇后,那么就不需要判断行是否安全,因为肯定安全,所以只需要判断该列是否安全,而且改对角线是否安全
col[0..7] 用true或者false表示
左对角线right[i+j],因为向左移就要向下移,一加一减总数没变
右对角线left[i-j]--为了避免出现负数 left[i-j+8]
[code]
void try(int row){//试第row行
int col; //循环变量,表示列号
int tmp; //临时变量
for(col=1;col<=8;col++){
if(c[col]&&right[row+col]&&left[row-col+8]){
list.add(row+" "+col);
c[col]=false;
right[row+col]=false;
left[row-col+8]=false;
if(row<8){
try(row+1);
}else{
打印list
}
c[col]=true;
right[row+col]=true;
left[row-col+8]=true;
}
}
}
[/code]
[img]http://dl.iteye.com/upload/picture/pic/94902/133043c3-9957-3c21-a5e0-4bf77c4d3f44.jpg[/img]
从第一行开始放皇后,那么就不需要判断行是否安全,因为肯定安全,所以只需要判断该列是否安全,而且改对角线是否安全
col[0..7] 用true或者false表示
左对角线right[i+j],因为向左移就要向下移,一加一减总数没变
右对角线left[i-j]--为了避免出现负数 left[i-j+8]
[code]
void try(int row){//试第row行
int col; //循环变量,表示列号
int tmp; //临时变量
for(col=1;col<=8;col++){
if(c[col]&&right[row+col]&&left[row-col+8]){
list.add(row+" "+col);
c[col]=false;
right[row+col]=false;
left[row-col+8]=false;
if(row<8){
try(row+1);
}else{
打印list
}
c[col]=true;
right[row+col]=true;
left[row-col+8]=true;
}
}
}
[/code]