八皇后问题(回溯法)C语言求解
方法一:
//N_Queen
#include<iostream>
using namespace std;
#define N 100 //定义最多求解100皇后问题
int x[N]; //存放N皇后问题的解
//判断皇后K放在x[k]列是否冲突
int Place(int k) {for(int i = 0; i < k; i++) {if(x[i] == x[k] || abs(i - k) == abs(x[i] - x[k])) //违反约束条件return 1; //冲突,返回1}return 0; //不冲突,返回0
}
//打印N皇后问题的一个解
void PrintQueen(int n) {for(int i = 0; i < n; i++) {printf("%5d", x[i] + 1); //数组下标从0开始,打印要求序号从1开始}printf("\n");
}
//回溯法求解
void Queen(int n) {int k = 0, num = 0; //num存储解的个数while (k >= 0) //摆放皇后k,注意0<=k<n{x[k]++; //在下一列摆放皇后kwhile (x[k] < n && Place(k) == 1 ) { //发生冲突x[k]++; //皇后K试探下一列}if(x[k] < n && k == n - 1) { //得到一个解,输出printf("第%d个解是:", ++num);PrintQueen(n);} else if (x[k] < n && k < n - 1) { //尚有皇后未摆放k = k + 1; //准备摆放下一个皇后} else {x[k--] = -1; //重置x[k],回溯,重新摆放下一个皇后k} }
}
int main() {int i , n;printf("请输入皇后的个数:");scanf("%d", &n);for(int i = 0; i < n; i++) {x[i] = -1;}Queen(n);system("pause");return 0;
}
方法二:
摘自百度百科https://baike.baidu.com/item/%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98/11053477?fr=aladdin
#include <iostream>
using namespace std;const int N = 8;
int arr[10], total_cnt;
// arr记录每一行(X)皇后的Y坐标bool isPlaceOK(int *a, int n, int c) {for (int i = 1; i <= n - 1; ++i) {if (a[i] == c || a[i] - i == c - n || a[i] + i == c + n)return false;//检查位置是否可以放//c是将要放置的位置//a[i] == c如果放在同一列,false//a[i] -+ i = c -+ n 如果在对角线上,false}return true;
}void printSol(int *a) {for (int i = 1; i <= N; ++i) { //遍历每一行for (int j = 1; j <= N; ++j) { //遍历每一列cout << (a[i] == j ? "X" : "-") << " ";;} //如果标记数组中这一行的皇后放在j位置,则输出X,否则输出-,//用空格分隔cout << endl; //每一行输出一个换行}cout << endl; //每一组数据一个换行分隔
}void addQueen(int *a, int n) {if (n > N) { //n代表从第一行开始放置printSol(a);total_cnt++;return ;}for (int i = 1; i <= N; ++i) { //i从第1列到第N列遍历if (isPlaceOK(a, n, i)) {a[n] = i; //如果可以放置,就把皇后放在第n行第i列addQueen(a, n + 1);}}}int main() {addQueen(arr, 1);cout << "total: " << total_cnt << " solutions.\n";return 0;
}
有时间我会补充一下注释,大家可以先自己理解理解
八皇后问题(回溯法)C语言求解相关推荐
- 八皇后问题 回溯法hdu2553
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- n皇后问题-回溯法求解
n皇后问题-回溯法求解 1.算法描述 在n×n格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. n皇后是由八皇后问题演变而来的.该问题 ...
- 回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle)
转载自:用回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle) N皇后问题 八皇后问题,是一个古老而著名的问题.该问题是国际西洋棋棋手马克斯·贝瑟尔于 ...
- Bailian2754 八皇后【回溯】
2754:八皇后 总时间限制: 1000ms 内存限制: 65536kB 描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格) ...
- 回溯法(八皇后问题)及C语言实现
回溯法,又被称为"试探法".解决问题时,每进行一步,都是抱着试试看的态度,如果发现当前选择并不是最好的,或者这么走下去肯定达不到目标,立刻做回退操作重新选择.这种走不通就回退再走的 ...
- [C语言]八皇后问题回溯算法
八皇后问题:在8×8格的国际象棋上摆放八个皇后,任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 将棋盘抽象为4 * 4到20 * 20大小的矩阵 输入样例: 请输入棋盘的大小(4 ...
- 八皇后问题、N皇后问题回溯法详解
/* * 回溯法解N皇后问题 * 使用一个一维数组表示皇后的位置 * 其中数组的下标表示皇后所在的行 * 数组元素的值表示皇后所在的列 * 这样设计的棋盘,所有皇后必定不在同一行 * * 假设前n-1 ...
- Bailian2698 八皇后【回溯】
2698:八皇后问题 总时间限制: 10000ms 内存限制: 65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和格式输出所有 ...
- n皇后问题(回溯法)
目录 1.问题描述 2.问题分析 3.完整源码 1.问题描述 八皇后问题是十九世纪著名的数学家高斯于1850年提出的.问题是:在8×8的棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同 ...
- PHP实现八皇后算法-回溯算法
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向前搜索,以 ...
最新文章
- java系统高并发解决方案
- springside / springside4—CRUD页面教程
- 数据结构--Dijkstra算法最清楚的讲解
- 初入Linux,M35作业第一弹,500字感想
- Spring Boot Web Slice测试–示例
- ubuntu所有php扩展php-7.0扩展列表
- html dom 知乎,知乎登录页 - 粒子运动效果
- javascript Array学习与使用
- python请简述构造函数和析构函数的作用_python – 构造函数和析构函数如何工作?...
- 填充table_Excel Power Query | 向下填充的逆过程
- 括弧匹配检验(信息学奥赛一本通-T1354)
- linux配置sonarqube遇到的坑
- apache java cache-control,Tomcat: Cache-Control
- android 70 使用ListView把数据显示至屏幕
- linux下如何查看二进制文件,Linux二进制文件的查看方法
- Matlab fftshift 详解
- 能上天的代码? NASA 火星无人机飞行控制系统开源了
- ios 制作方形头像
- canvas画圆和线条动画
- 看日光穿过手指 享受芬芳的下午茶