八皇后问题
来源:互联网 发布:linux tail命令 编辑:程序博客网 时间:2024/05/18 00:22
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。(摘自百度百科)
#include <stdio.h>#include <stdbool.h>#define maxBoard 30 // 棋盘最大为30*30int boardSize; // 棋盘边长 = 皇后最大数目int count; // 皇后数目int queenSquare[maxBoard][maxBoard]; // 棋盘bool isSolved() // 是否得到问题的一个解{ return (count == boardSize); // 判断条件:皇后数目与边长相等}void print() // 打印棋盘{ int i, j; for (i = 0; i < boardSize; i++) { for (j = 0; j < boardSize; j++) { printf(" %d ", queenSquare[i][j]); } printf("\n"); } printf("\n");}void _remove(int col) // 移除一个棋子{ queenSquare[--count][col] = 0;}void insert(int col) // 放置一个棋子{ queenSquare[count++][col] = 1;}void loadQueens() // 加载游戏信息并置空棋盘{ int row, col; count = 0; for (row = 0; row < boardSize; row++) for (col = 0; col < boardSize; col++) queenSquare[row][col] = 0;}int unguarded(int col) // 判断皇后是否会被前面的皇后攻击{ int i; int ok = 1; for (i = 0; ok && i < count; i++) // 判断所在列有没有皇后 ok = !queenSquare[i][col]; for (i = 1; ok && (count - i) >= 0 && (col - i) >= 0; i++) // 判断左斜对角有没有皇后 ok = !queenSquare[count - i][col - i]; for (i = 1; ok && (count - i) >= 0 && (col + i) < boardSize; i++) // 判断右斜对角有没有皇后 ok = !queenSquare[count - i][col + i]; // 若有皇后,ok被置为false return ok;}void printInformation(){ printf("This is the Queens game.\n");}void solveFrom() // 求解函数{ int col; if (isSolved()) // 如果找到一个解 print(); // 打印这个解 else for (col = 0; col < boardSize; col++) if (unguarded(col)) // 如果不会被前面的皇后攻击 { insert(col); // 在这个位置插入皇后 solveFrom(); _remove(col); // 后面有皇后会被攻击,则移除这个皇后 }}int main(void){ printInformation(); printf("What is the size of the board? "); scanf(" %d", &boardSize); if (boardSize < 0 || boardSize > maxBoard) printf("The number must between 0 and %d.\n", maxBoard); else { loadQueens(); solveFrom(); } return 0;}
0 0
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题(2)
- 八皇后问题(3)
- 八皇后问题
- 八皇后问题程序
- 浅谈八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 八皇后问题求解
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 里氏替换原则(LSP)
- 对象及内存管理——final修饰符
- MNIST手写字识别的TensorFlow实现
- Machine Learning第二讲[多变量线性回归] --(一)多变量线性回归
- 欢迎使用CSDN-markdown编辑器
- 八皇后问题
- 精通Python网络爬虫-书籍介绍
- 将十进制的各个位数分离出来
- Unity编程笔记----多语言切换
- 比特币区块结构解析
- MATLAB深度学习CNN包的代码详解补充及各变量参数说明
- C语言——指针的运算
- 系统延迟及定时
- ES6中 字符串中扩展 的方法