八皇后问题

来源:互联网 发布:js 设置div display 编辑:程序博客网 时间:2024/06/02 06:47

一直以为八皇后的问题是一个超级复杂的题目,可是这两天好好看了下递归、回溯的问题,发现其实实现起来还是比较容易的。所以,与大家分享一下。


代码:

#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");elseprintf("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");elseprintf("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;}




0 0
原创粉丝点击