博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
N皇后问题
阅读量:6813 次
发布时间:2019-06-26

本文共 1803 字,大约阅读时间需要 6 分钟。

N皇后问题

•问题描述

  在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。

•算法分析

      只考虑第i个皇后放置在第i行的哪一列,所以在放置第i个皇后的时候,可以从第1列判断起,如果可以放置在第1个位置,则跳到下一行放置下一个皇后。如果不能,则跳到下一列...直到最后一列,如果最后一列也不能放置,则说明此时放置方法出错,则回到上一个皇后向之前放置的下一列重新放置。

      当第n个皇后放置成功后,即得到一个可行解,此时再回到上一个皇后重新放置寻找下一个可行解...如此后,即可找出一个n皇后问题的所有可行解。

•解空间

     4*4国际象棋盘,4个皇后

•算法分析

     深度优先遍历

     剪枝函数

        约束函数

    if((col[k] - col[i])*(fabs(col[k] - col[i]) - fabs(k - i))!=0),即当之前所有皇后与皇后i不在同一水平、垂直方向,也不在对角线方向上时,可以在当前位置放置皇后i,否则考虑下一个位置

1 void Queen(int i,int n){ 2     if(i > n) 3         Output(); 4     else{ 5         for(int j=1;j<=n;++j){ 6             int k = 1; 7             col[i] = j; 8             while(k < i){ 9             if((col[k] - col[i])*(fabs(col[k] - col[i]) - fabs(k - i))!=0){10             k++;11             if(k == i)12                 Queen(i+1, n);13              }14             else{15             break;16             }17               }18         }19     }20 }

 

•小结

     算法效率

        时间复杂度分析

     深度优先遍历

     剪枝函数

        约束函数:判断皇后是否处于同一水平、垂直、对角线方向

     迭代回溯

•同学的完整代码

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 int path[110]; 7 int row[110],n,m,cnt; 8 bool judge(int x) 9 {10 for(int i=1;i
m)17 {18 for(int i=1;i<=m;i++)19 printf("%d ",row[i]);20 printf("\n");21 cnt++;22 return;23 }24 for(int i=1;i<=n;i++)25 {26 row[x]=i;27 if(judge(x))28 dfs(x+1);29 }30 }31 int main()32 {33 while(scanf("%d%d",&n,&m)!=EOF)34 {35 memset(path,0,sizeof(path));36 memset(row,-1,sizeof(row));37 cnt=0;38 dfs(1);39 printf("%d\n",cnt);40 }41 return 0;42 }
View Code

 

 

转载地址:http://lswzl.baihongyu.com/

你可能感兴趣的文章
【Selenium】1.介绍 Selenium
查看>>
wxpython仿写记事本
查看>>
MM 常用表
查看>>
XCode6自定义pch文件
查看>>
正则表达式--简单记忆一
查看>>
字符数组的ss.toString()和new String(ss)的问题
查看>>
CentOS上安装多版本Python问题
查看>>
查看MySQL版本
查看>>
IE8的项目在IE11下 一些功能无法实现的解决方案
查看>>
关于extern的使用
查看>>
Zsh安装及常用操作
查看>>
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path 解决办法
查看>>
Saltstack系列2:Saltstack远程执行命令
查看>>
使用工厂方法模式实现多数据库WinForm手机号码查询器(附源码)
查看>>
C#中窗体的close,dispose,以及application.exit()的区别
查看>>
github的使用 sourceTree
查看>>
iOS POST 上传图片
查看>>
Codeforces Round #435 (Div. 2) E. Mahmoud and Ehab and the function[二分]
查看>>
最全面的 Spring 学习笔记
查看>>
【037】Excel 中遍历修改文件(VBA)
查看>>