解这种问题,回溯是一个很好的方法,容易实现
- #include <iostream>
- using namespace std;
- #define QUEEN_NUM 8
- int count = 0;
- int isCorrect(int i,int j,int Q[QUEEN_NUM][QUEEN_NUM]){
- int row,col;
- for(row=0;row<QUEEN_NUM;row++)
- if(Q[row][j] == 1 && row != i)return 0;
- for(col=0;col<QUEEN_NUM;col++)
- if(Q[i][col] == 1 && col != j)return 0;
- for(row=i-1,col=j-1;row>=0 && col>=0;row--,col--)//左上
- if(Q[row][col] == 1 && row!=i && col!=j)return 0;
- for(row=i+1,col=j-1;row<QUEEN_NUM && col>=0;row++,col--)//左下
- if(Q[row][col] == 1 && row!=i && col!=j)return 0;
- for(row=i+1,col=j+1;row<QUEEN_NUM && col<QUEEN_NUM;row++,col++)//右下
- if(Q[row][col] == 1 && row!=i && col!=j)return 0;
- for(row=i-1,col=j+1;row>=0 && col<QUEEN_NUM;row--,col++)//右上
- if(Q[row][col] == 1 && row!=i && col!=j)return 0;
- return 1;
- }
- void Queen(int j,int Q[QUEEN_NUM][QUEEN_NUM]){
- if(QUEEN_NUM == j){
- for(int i = 0;i<QUEEN_NUM;i++){
- for(int k = 0;k < QUEEN_NUM;k++){
- cout<<Q[i][k];
- }
- cout<<endl;
- }
- cout<<endl;
- count++;
- }
- for(int i=0;i<QUEEN_NUM;i++){
- if(isCorrect(i,j,Q)){
- Q[i][j] = 1;
- Queen(j+1,Q);
- Q[i][j] = 0;//如果没有可能或子函数执行完,回溯,位置变量重新置为0
- }
- }
- }
- int main(){
- int Q[QUEEN_NUM][QUEEN_NUM];
- int i,j;
- for(i=0;i<QUEEN_NUM;i++){
- for(j=0;j<QUEEN_NUM;j++){
- Q[i][j] = 0;
- }
- }
- Queen(0,Q);
- cout<<"count:"<<count<<endl;
- system("pause");
- return 0;
- }
ps.存储棋盘其实用一维的数组就可以了,结合下标进行。
转载于:https://blog.51cto.com/loghyr/960382