使用回溯法来解决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工程,运行一切正常.


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 财务人员进入税务黑名单怎么办 社保本丢了怎么办 贷款车辆登记证书怎么办 发票薄丢了怎么办? 汽车发票丢了怎么办 税票弄丢了怎么办 交强险正本丢了怎么办 个体营业执照正本丢失怎么办 简易注销后税务怎么办 拒绝了日历邀请怎么办 老人走丢了怎么办 老人走丢找不到怎么办 没人给介绍对象怎么办 bate365账号被锁怎么办 qq号疑似被盗怎么办 不知道音乐名字怎么办 忘记支付宝登录怎么办 微信被老婆拉黑怎么办 微信群昵称改不了怎么办 微信号设置不了怎么办 修改微信号点不开怎么办 多屏设置失败怎么办 icould密码忘了怎么办 微信号换不了怎么办 微信号改不了怎么办? 无法设置微信号怎么办 公司改名后商标怎么办 公司名称变更后发票怎么办 被起诉公司企业变更怎么办 企业公章坏了怎么办 公司更名旧公章怎么办 手机证书不匹配怎么办 开庭对方不到场怎么办 被告公司名称写错怎么办 id卡丢失了怎么办 血小板高到1080怎么办 打印机处于错误状态怎么办 打印机晒鼓错误怎么办 打印机显示通讯错误怎么办 计算机名改不了怎么办 打印机显示未联机怎么办