C语言:试探算法解决“八皇后”问题
2024-08-29 21:51:01
#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]。
最新文章
- [转载]SQL Server如何保证可空字段中非空值唯一
- μC/OS-Ⅲ系统的中断管理
- curd 里url传输汉字验证错误问题解决方法
- 解决ScrollView里如果有动态更新的ChildView时会自动滚动到底部的方法
- jvm分析(MD语法)
- Genymotion模拟器环境搭建中的各种坑,终极解决办法
- Unity多语言本地化改进版
- Ubuntu 13.04安装搜狗输入法
- android5.x以上 状态栏透明的问题
- 静态成员变量.xml
- eclipse上传显示svn上传者名
- FCKEditor的用法(asp版)
- (续)线性表之双向链表(C语言实现)
- [开源]C#二维码生成解析工具,可添加自定义Logo (转)
- java变量、二进制、数据类型、原码、补码、反码
- POJ3228 并查集或二分最大流枚举答案
- java基础知识1--String常用方法总结
- Ubuntu 16.04 启用 点击Launcher图标,窗口实现最小化 功能
- 更改linux终端中用户名颜色
- mac系统在配置navicat时连接数据的时候提示can&#39;t connect to mysql server on &#39;127.0.0.1&#39;
热门文章
- H3C交换机端口聚合配置
- 说说 JavaScript中 call和apply
- Codeforces Round #626 Div2 D. Present(位掩码,二分)
- 2019HDU多校 Round9
- 西南民族大学第十二届程序设计竞赛(同步赛) A.逃出机房 (bfs)
- 使用eclipse搭建第一个java web应用
- SQL 计算表A字段在表B字段中出现的次数
- Python3.7.9+Locust1.4.3版本性能测试工具案例分享
- ArcGIS处理栅格数据(二)
- spring再学习之基本概念