<pre name="code" class="cpp">#include <iostream> using namespace std ; int total = 0 ; //判断row行line列是否可以放皇后 bool isCan(int row , int line , int chess[8][8]) { int i , j ; //判断同列中是否有皇后 for( i = 0 ; i < 8 ; i++) { if(chess[i][line] == 1) { return false ; } } //判断左上是否有皇后 for( i = row , j = line ; i >= 0 && j >= 0 ; i-- , j--) { if(chess[i][j] == 1) { return false ; } } //判断右上是否有皇后 for( i = row , j = line ; i >= 0 && j < 8 ; i-- , j++) { if(chess[i][j] == 1) { return false ; } } //判断左下是否有皇后 for( i = row , j = line ; i < 8 && j >= 0 ; i++ , j--) { if(chess[i][j] == 1) { return false ; } } //判断右下是否有皇后 for( i = row , j = line ; i < 8 && j < 8 ; i++ , j++) { if(chess[i][j] == 1) { return false ; } } return true ; } //row表示从0行开始递归到最后一行 //line是8列 void Eightqueen( int row , int line , int chess[8][8]) { int chessCopy[8][8] , i , j ; //复制出一个新的棋盘 for( i= 0 ; i < 8 ; i++) { for( j = 0 ; j < 8 ; j++) { chessCopy[i][j] = chess[i][j] ; } } if( row == 8) //如果每行都放了一个皇后 { total++ ; cout << "第" << total << "中方案:" << endl ; for( i = 0 ; i < 8 ; i++) { for( j = 0 ; j < 8 ; j++) { cout << chess[i][j] << " " ; } cout << endl ; } cout << endl ; } else { for(i = 0 ; i < 8 ; i++) //从每行的第一个各自开始放 { if(isCan( row , i , chessCopy))//如果该格可以放 { for(j=0 ; j < i ; j++) //清除以前放过的皇后 { chessCopy[row][j] = 0 ; } chessCopy[row][i] = 1 ; Eightqueen(row+1 , line , chessCopy) ;// 去下一行里寻找 } } } } int main() { int chess[8][8] , i , j ; for( i = 0 ; i < 8 ; i++) { for( j = 0 ; j < 8 ; j++) { chess[i][j] = 0 ; } } Eightqueen( 0 , 8 , chess) ; return 0; }
用递归枚举实现八皇后问题
猜你喜欢
转载自blog.csdn.net/ly1390811049/article/details/50868214
今日推荐
周排行