使用回溯法来解决n皇后问题
来源:互联网 发布:中美知乎 编辑:程序博客网 时间:2024/05/20 20:43
问题描述:
在一个N*N的棋盘上放置N个皇后,使得这N个皇后不能相互攻击,共有多少种不同的放置方法?
#include <stdio.h>#include <stdlib.h>#include <memory.h>#include <math.h>int * X = NULL;int solutionCounts = 0;//确定第k个皇后是不是能在第X[k]列上bool Place(int k){int i = 1;while(i<k){if(X[i] == X[k] || abs(X[i] - X[k]) == abs(i - k)){return false ;}i++;}return true;}void Print(int * X, int n){printf("第%d种方案如下:\n", solutionCounts);for(int i = 1; i<=n; i++){printf("第%d个皇后的位置为:%d行%d列\n", i, i, X[i]);}}//其实是按一颗动态树来采用回溯法解决void NQueens(int n){int k = 1;while(k>0){//先找准第k个皇后的位置X[k] = X[k]+1;while(X[k]<=n && Place(k) == false){X[k] += 1;//转至下一列寻找合适的位置}//然后发现如果这个皇后还可以有下一个皇后摆的位置的话就继续向下找下一个皇后的位置if(X[k] <= n){if(k==n) //说明所有的皇后的位置都已经确定了{solutionCounts++;Print(X, n);}else{k += 1;//向下找下一个皇后的位置X[k] = 0;}}else //说明这个皇后的这条路径已经走到头了k -= 1;}}void main(){int n = 0;puts("please input the number of queens:");scanf("%d",&n);int *columns = (int *)malloc(n*sizeof(int));memset((void *)columns, 0, n*sizeof(int));X = columns;NQueens(n);}
碰到的问题:
1、还是不能根据思路很好的转化为代码;
2、解决了一个在Visaul Studio2008上边出现的一个错误:“没有找到MSVCR90D.dll”,解决方法为:
a,选择 菜单 Project -> 工程 Properties ,或者按 ALT+F7.打开 当前工程的 PropertyPages属性窗口,选择 Configuration Properties->Manifest Tool;在右边窗口中 设置Use FAT32 Work-around 项为 Yes.单击确定退出.
b,Rebuild工程,运行一切正常.
- 使用回溯法来解决n皇后问题
- 回溯法解决N皇后问题
- 回溯法解决N皇后问题
- 回溯法解决N皇后问题
- 回溯法解决n皇后问题
- 回溯法解决N皇后问题
- 回溯法解决N皇后问题
- 回溯法解决N皇后问题
- 回溯法解决n皇后问题
- java回溯法解决n皇后问题
- 回溯法解决2n皇后(8皇后)问题
- 八皇后扩展--n皇后问题 使用回溯法
- n皇后问题-回溯法
- 【回溯法】n皇后问题
- N皇后问题,回溯法
- 回溯法---n皇后问题
- N皇后问题 【回溯法】
- 【回溯法】n皇后问题
- 深入Struts2
- 内核栈
- Linux 常用时间统计函数
- Windows Sockets 网络编程
- Exchange--SSO简单
- 使用回溯法来解决n皇后问题
- PowerDesigner 企业架构模型 ( EAM ) 说明
- allegro导入cad的dxf文档
- QNX VMWARE与IDE连接
- 重新认识excel(1)
- 单元测试
- OSI七层模型与各层设备对应
- ioctl 函数
- 用ADO编制SQLPlus程序