一直以为八皇后的问题是一个超级复杂的题目,可是这两天好好看了下递归、回溯的问题,发现其实实现起来还是比较容易的。所以,与大家分享一下。
代码:
#include <cstdio> #include <iostream> #include <cstdlib> using namespace std; int ans = 0; int f[8]; //f[i]表示,第i+1行皇后的位置 void print(){ int i, j; for(i=0; i<8; i++){ for(j=0; j<8; ++j){ if(f[i] == j) printf("1"); else printf("0"); printf(" "); } printf("\n"); } printf("\n"); } int EightQueen(int row){ if(row >= 8){ //如果成功,ans++,打印八皇后图 ans++; print();return 0; } else{int i, j; for(i=0; i<8; ++i){ f[row] = i; int flag = 1; for(j=0; j<row; ++j){ if(f[j] == f[row] || f[j]-j == f[row]-row || f[j]+j == f[row]+row){ //如果存在危险,标志为0,继续找 flag = 0; break; } } if(flag){ //如果本行没有危险,就向下一行寻找 EightQueen(row+1); } } } return 0; } int main(){ EightQueen(0); cout << "一共多少种方法:" << ans << endl; return 0; }
同样,根据八皇后的解法,也可以推出n皇后的方法(n<=11),因为方法是递归,所以不宜很多层。
#include <cstdio> #include <iostream> #include <cstdlib> using namespace std; int ans = 0, n; int f[15]; //f[i]表示,第i+1行皇后的位置 void print(){ int i, j; for(i=0; i<n; i++){ for(j=0; j<n; ++j){ if(f[i] == j) printf("1"); else printf("0"); printf(" "); } printf("\n"); } printf("\n"); } int EightQueen(int row){ if(row >= n){ //如果成功,ans++,打印n皇后图 ans++; print();return 0; } else{int i, j; for(i=0; i<n; ++i){ f[row] = i; int flag = 1; for(j=0; j<row; ++j){ if(f[j] == f[row] || f[j]-j == f[row]-row || f[j]+j == f[row]+row){ //如果存在危险,标志为0,继续找 flag = 0; break; } } if(flag){ //如果本行没有危险,就向下一行寻找 EightQueen(row+1); } } } return 0; } int main(){ while(~scanf("%d", &n)){ EightQueen(0); cout << "一共多少种方法:" << ans << endl; } return 0; }
原文:http://blog.csdn.net/mullerwch/article/details/20623937