#include <stdio.h>

#define N 4

int solution[N], j, k, count, sols;

int place(int row, int col)
{
for (j = 0; j <row; j++)
{
if (row - j == solution[row] - solution[j] || row + solution[row] == j + solution[j] || solution[j] == solution[row])
return 0;
}
return 1;
} void backtrack(int row)
{
count++;
if (N == row)
{
sols++;
for (k = 0; k <N; k++)
printf("%d\t", solution[k]);
printf("\n\n");
}
else
{
int i;
for (i = 0; i <N; i++)
{
solution[row] = i;
if (place(row, i))
backtrack(row + 1);
}
}
} void queens()
{
backtrack(0);
} int main(void)
{
queens();
printf("总共方案: %d\n", sols);
getch();
return 0;
}

算法分析:首先将这个问题简化,设为4x4的棋盘,每行都从0开始,即行数row为0,1,2,3;每列都从0开始,即列数col也为0,1,2,3,第0行的任意一个数都不存在被攻击,对于第一行第二行第三行的数,满足下面三个条件之一都会被攻击:1)、棋盘反斜线上横坐标之差等于纵坐标之;2)、棋盘正斜线上横坐标与纵坐标之和相等;3)、同一列上纵坐标相等;如果该行的所有方格都被攻击,则不会进入下一行。若果进入第三行仍然不存在攻击,则会发生N==row,此时会打印出solution[0],solution[1],solution[2],solution[3]。另外,solution[row]=i的作用是每行逐个将i的值(0,1,2,3)即列的值进行试探,最后得到solution[row],即最终得到solution[0],solution[1],solution[2],solution[3]。

最新文章

  1. [转载]SQL Server如何保证可空字段中非空值唯一
  2. μC/OS-Ⅲ系统的中断管理
  3. curd 里url传输汉字验证错误问题解决方法
  4. 解决ScrollView里如果有动态更新的ChildView时会自动滚动到底部的方法
  5. jvm分析(MD语法)
  6. Genymotion模拟器环境搭建中的各种坑,终极解决办法
  7. Unity多语言本地化改进版
  8. Ubuntu 13.04安装搜狗输入法
  9. android5.x以上 状态栏透明的问题
  10. 静态成员变量.xml
  11. eclipse上传显示svn上传者名
  12. FCKEditor的用法(asp版)
  13. (续)线性表之双向链表(C语言实现)
  14. [开源]C#二维码生成解析工具,可添加自定义Logo (转)
  15. java变量、二进制、数据类型、原码、补码、反码
  16. POJ3228 并查集或二分最大流枚举答案
  17. java基础知识1--String常用方法总结
  18. Ubuntu 16.04 启用 点击Launcher图标,窗口实现最小化 功能
  19. 更改linux终端中用户名颜色
  20. mac系统在配置navicat时连接数据的时候提示can&#39;t connect to mysql server on &#39;127.0.0.1&#39;

热门文章

  1. H3C交换机端口聚合配置
  2. 说说 JavaScript中 call和apply
  3. Codeforces Round #626 Div2 D. Present(位掩码,二分)
  4. 2019HDU多校 Round9
  5. 西南民族大学第十二届程序设计竞赛(同步赛) A.逃出机房 (bfs)
  6. 使用eclipse搭建第一个java web应用
  7. SQL 计算表A字段在表B字段中出现的次数
  8. Python3.7.9+Locust1.4.3版本性能测试工具案例分享
  9. ArcGIS处理栅格数据(二)
  10. spring再学习之基本概念