C语言解决八皇后问题

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 /* this code is used to cope with the problem of the eight queens.
  5  * array borad[9][9] is a virtual borad.
  6  * line 0 and volumn 0 is ignored.
  7  * at first we find a place to set a queen on it, then mark this queen‘s
  8  * domain. the way of marking domain is add 1 on the board[line][volumn],
  9  * so the number of board[line][volumn] means this place can attacked by
 10  * how many queens. after we mark this queen‘s domain, we move on to next line.
 11  * if there is no next line, we got a solution */
 12 /* 这些代码主要用来解决八皇后问题
 13  * 数组borad[9][9]是一个虚拟的棋盘。
 14  * 第0行跟第0列被忽略
 15  * 在最开始时,我们在某一行上找到一个位置,放上皇后后,我们把这个皇后能
 16  * 攻击的范围都标志起来。我们标志的方法是在board[行][列]上加1,
 17  * 所以board[行][列]上的值意味着这个位置能被多少个皇后攻击
 18  * 当我们标志好这个皇后的范围后,我们就跳到下一行去。
 19  * 如果已经没有下一行了,那么我们就找到一个放置方法了 */
 20
 21 /* if a place on board have been marked by NONE
 22  * it means no queen can attack this place, it is a potential place to set a queen */
 23 /* 如果棋盘上一个位置被设置为NONE,意味着没有皇后能攻击这个位置,这个位置可以被设置为皇后 */
 24 #define NONE        (0)
 25 #define QUEEN       (-1)
 26
 27 #define OCCUPY      (1)
 28 #define DISOCCUPY   (0)
 29
 30 void Compute(int line) ;
 31 void PrintBorad(void) ;
 32 void operate_borad(int line, int volumn, int function) ;
 33
 34 int main(void)
 35 {
 36     Compute(1) ;
 37     return 0 ;
 38 }
 39
 40 /* ignored the first line and the first volumn */
 41 int borad[9][9] ;
 42
 43 /* this is a recursive function.
 44  * it will find a queen on this line,
 45  * then fine next one of next line by call itself */
 46 /* 这是一个递归函数。在某一行上找到皇后的位置,然后调用自己找下一行的皇后 */
 47 void Compute(int line)
 48 {
 49     int i ;
 50     static int num_of_solution = 0;
 51
 52     for(i = 1; i <= 8; i++)
 53         if(borad[line][i] == NONE)
 54         {
 55             operate_borad(line, i, OCCUPY) ;
 56             if(line == 8) // find a solution
 57             {
 58                 printf("%d\n", ++num_of_solution) ;
 59                 PrintBorad() ;
 60             }
 61             else Compute(line +1) ; /* contine to next line */ /* 查找一行的皇后 */
 62             operate_borad(line, i, DISOCCUPY) ;
 63         }
 64 }
 65
 66 /* function:
 67  * if function is OCCUPY, then set a flag of queen on borad[line][volumn]
 68  *   and set a flag on the domain of this queen
 69  * if function is DISOCCUPY, then clear flag of queen on borad[line][volumn]
 70  *   and clear the flag on the domain of this queen */
 71 /* 功能:
 72  * 如果function变量是OCCUPY,那么在board[line][volumn]上放上皇后,
 73  * 并设置这个皇后的攻击范围
 74  * 如果function变量是DISOCCUPY,那么把皇后从board[line][volumn]上清除
 75  * 并清除这个皇后在其攻击范围上所设置的标志 */
 76 void operate_borad(int line, int volumn, int function)
 77 {
 78     int i, j, *temp, nl, nv ;
 79
 80     borad[line][volumn] = (function == OCCUPY ? QUEEN : NONE) ;
 81
 82     /* i and j are used to decide the direction*/
 83     for(i = -1; i <= 1; i++)
 84         for(j = -1; j <= 1; j++)
 85             if(i == 0 && j == 0) continue ;
 86             else
 87             for(nl = line +i, nv = volumn +j ;
 88                 nl >= 1 && nl <= 8 && nv >= 1 && nv <= 8 ;
 89                 nl += i, nv += j)
 90             {
 91                 temp = &borad[nl][nv] ;
 92                 /* add one means this place can be attack by another queen */
 93                 function == OCCUPY ? (*temp)++ : (*temp)-- ;
 94             }
 95 }
 96 /* function: print the board on the screen */
 97 /* 打印棋盘 */
 98 void PrintBorad(void)
 99 {
100     int x, y, chess ;
101
102     for(x = 1; x <= 8; x++)
103     {
104         for(y = 1; y <= 8; y++)
105         {
106             chess = borad[x][y] ;
107             if(chess != QUEEN)
108                 putchar(‘*‘) ;
109             else
110                 putchar(‘Q‘) ;
111         }
112         putchar(‘\n‘) ;
113     }
114 }
时间: 2024-10-26 05:24:23

C语言解决八皇后问题的相关文章

回溯算法-C#语言解决八皇后问题的写法与优化

结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解答一万遍了,大多还是回溯法解决的. 关于回溯算法:个人理解为就是优化的穷举算法,穷举算法是指列出所有的可能情况,而回溯算法则是试探发现问题"剪枝"回退到上个节点,换一条路,能够大大提高求解效率. 具体到8皇后问题上来说,需要考虑以下几点: 1)将8个皇后定义为8行中的相对位置来标识,考虑增

回溯法解决八皇后问题

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

python解决八皇后问题

经典回溯算法:八皇后问题 算法要求: 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上. 国际象棋的棋盘如下图所示: 问共有多少种不同的方法,并且指出各种不同的放法. # -*- coding:utf-8 -*- __author__ = "tyomcat" print("******八皇后问题的解决方法******") def next_col(current, n=8): length = len(curr

C语言学习--八皇后问题

问题描述: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 程序设计: 1.一维数组a[17],数组分成三段,第一段a[0]用来标记八皇后安置完成:第二段a[1,8]用来标记列位置有无子,方便判断列冲突:第三段a[9,16]用来标记存储位置. 2.关键算法 递归判断位置,eightQueens . 3.对角线位置互斥判断, isDiagonal. 4.输出函数, printResult. 算法描述: 1.首次传入为数组a

笨办法解决 八皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.计算机发明后,有多种计算机语言可以解决此问题. 本人以数学坐标为依据进行计算: 假设棋盘的左下角空格坐标为  x:1,y:1 ,右上角 空格坐标

使用java语言实现八皇后问题

八皇后问题,在一个8X8的棋盘中,放置八个棋子,每个棋子的上下左右,左上左下,右上右下方向上不得有其他棋子.正确答案为92中,接下来用java语言实现. 解: package eightQuen; /** * 八皇后问题 * * @author 83771 * */ public class eight { // 定义一个数组 表示棋盘 public static Integer[][] checkerBoard = new Integer[8][8]; // 棋盘副本 public stati

【算法】用Lua解决八皇后的问题

最近在学习Lua脚本,经过了不到十天的学习,也算是对语法有所了解吧,另外正好也看到了八皇后问题,感觉挺有意思的 就试了试用算法解出来. 八皇后问题的原题是:八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上. 以下是lua的算法代码: local eightQueen = { 0,0,0,0,0,0,0,0,} local count = 0 functi

解决八皇后问题,递归与非递归方式两种

回溯法理解,一般形式 void Bcktrack(int t) //参数t表示当前递归深度 { if(t>n)Output(x); //遍历到解,则将解输出或其他处理 else { //f(n,t)和g(n,t)表示当前节点(扩展节点)处未搜索过的子树的起始编号和中指编号 for(int i=f(n,t);i<=g(n,t);i++) { x[t]=h(i); //h(i)表示当前节点(扩展节点)处x[i]的第i个可选值 if(Constarint(t)&&Bound(t))

八行代码解决八皇后问题(c++)

说的有点夸装,实际上并不只是巴航代码,加上前面的变量声明之类的一共有40多行的样子吧,好像是在知乎上看到的,现在有时间再把它写下来: 其中用到了一些c++11特性,例如lambda 以及给予范围的 for循环. 其他的没什么好说的,看代码,上面也有注释的. 1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 #include <set> 5 using namespace st