查看文章 |
1、递归。递归真是个好东西,解法一目了然。 #include<stdio.h> int l[14]; void try(int i) for(j=0; j<N; j++) if(i+1 == N) l[i+j] = 0; int main() }
2、非递归解 #include <iostream.h> { queen[col]++ ; //col列上的皇后走到下一行试试 if(queen[col] >= QUEEN) //当前列全部走完 { queen[col] = -1 ; //当前列棋子置于准备状态 col-- ; //回溯到上一列的棋子 if(col>=0) //回溯时要清理如下行,斜线的标志位 { col_YN[queen[col]] = false ; passive_YN[queen[col] + col] = false ; negative_YN[QUEEN-1 + col - queen[col]] = false ; } } else { //先判断棋子所在行没有棋子 if(col_YN[queen[col]] == false) { flag = true ; //以下检查当前棋子是否与之前的棋子斜线相交 if( passive_YN[queen[col] + col] == true || negative_YN[QUEEN-1 + col - queen[col]] == true) flag = false ; else flag = true ; if(flag) // flag为真表示位置合法 { if(col == QUEEN-1) //列到达最后,即最后一个皇后也找到位置,输出解 { count++ ; //解法的数目加一 ; cout<<"***第"<<count<<"种解法***"<<endl ; for(int i=0;i<QUEEN;i++) cout<<"第"<<i<<"列皇后在第"<<queen[ i ]<<"行"<<endl; } col_YN[queen[col]] = true ;// 当前行设为有棋子 passive_YN[queen[col] + col] = true ;//当前行正斜率方向有棋子 negative_YN[QUEEN-1 + col - queen[col]] = true ; //当前行负斜率方向 上也有棋子 col++ ; if(col >= QUEEN) { // 找到解后再次回溯找另外的解,这同上面无解回溯是一样的 col-- ; col_YN[queen[col]] = false ; passive_YN[queen[col] + col] = false ; negative_YN[QUEEN-1 + col - queen[col]] = false ;//原理同回溯 } flag = false ; } } } } cout<<QUEEN<<"皇后问题一共有"<<count<<"种解法"<<endl ; return 0 ; } |