C语言回溯算法解决N皇后问题

回溯算法的模型是 x++, not satisfy ? x-- : continue.

代码中x作列号,y[x]保存第x列上皇后放置的位置。

 1 #include<stdio.h>
 2 #include<math.h>
 3 #define N 5
 4 int position_check(int,int*);
 5 void print_board(int count,int* y);
 6 int main()
 7 {
 8     int y[N]= {0}; //记录每列上的皇后放的位置
 9     int count = 0; //解的个数
10     int x = 1;
11     while(x>0)
12     {
13         y[x]++;      //为当前x位置找一个皇后的位置
14         while((y[x]<=N) && !position_check(x,y))
15             y[x]++; //找到合适的皇后
16         //
17         if(y[x]<=N)//找到一个可以放置第x个皇后的位置,到该步为止,所求部分解都满足要求
18         {
19             if(x==N)//找到一个完整的放置方案
20             {
21                 count++;
22                 printf("%d\n",count);
23                 for( int i=1; i<=N; i ++ )
24                 {
25                     for( int j=1; j<=N; j++ )
26                         if( j==y[i] ) printf("x ");//如果该位置放了皇后则显示x
27                         else printf("o ");
28                     printf("\n");
29                 }
30             }
31             else
32                 x++; //继续寻找下一个皇后的位置,还没找到完整解决方案
33         }
34         else//未找到可以放置第x个皇后的位置,到该步为止,已经知道不满足要求
35         {
36             y[x] = 0;//因为要回溯,下一次是寻找第x-1个皇后的位置,
37             //在下一次确定x-1的位置之后,第x个皇后的开始搜索的位置要重置
38             x--; //回溯
39         }
40     }
41 }
42 int position_check(int k,int* y) //测试合法性
43 {
44     for(int j = 1; j < k; j++)
45         if((abs(k-j) == abs(y[j] - y[k]))||(y[j] == y[k]))
46             return 0;
47     return 1;
48 }

看了唐大仕老师的8皇后改的,基本是复制粘贴 ( ╯□╰ )

时间: 2024-10-28 01:41:31

C语言回溯算法解决N皇后问题的相关文章

回溯算法解八皇后问题(java版)

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

回溯法解决八皇后问题

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

Lasvegas+回溯算法解决3SAT问题(C++实现代码)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46507919 1.SAT问题描述 命题逻辑中合取范式 (CNF) 的可满足性问题 (SAT)是当代理论计算机科学的核心问题, 是一典型的NP 完全问题.在定义可满足性问题SAT之前,先引进一些逻辑符号. 一个 SAT 问题是指: 对于给定的 CNF 是否存在一组关于命题变元的真值指派使得A 为真. 显然, 如果A 为真, 则 CNF 的每个子句中必有一个命题变元为 1 (真) .

经典回溯算法(八皇后问题)详解

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上 (斜率为1),问有多少种摆法.高斯认为有76种方案. 1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果. 计算机发明后,有多种方法可以解决此问题. 算法思路:    首先我们分析一下问题的解,我们每取出一个皇后,放入一行,共有八种不同的放法

C++使用回溯算法解决简单迷宫问题

给你一个矩阵,如何在其中找到一条通路呢? (是不是很凌乱?^_^) 在C++中怎么实现呢? 较好的解决方案:使用栈解决. 解决思路: 使用FILE*和open预先打开文件(绝对路径和相对路径1),注意断言. 正确读取文件,判断字符和空格,空格略过,读取字符. 从入口进入,每走一步,判断上下左右4个方向有无道路. 如果4个方向有路,则按次序先进入其中一条(将字符压栈push),并将所走过字符重置数字(后面回溯). 如果4个方向没有,则出栈pop,即回溯,并再次判断. 逐次循环,直至判断下一个有效节

回溯算法(八皇后问题)

八皇后问题 在国际象棋中,皇后是最强大的一枚棋子,可以吃掉与其在同一行.列和斜线的敌方棋子. 将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法? 程序实现 程序摘自回溯法与八皇后问题 #include<iostream> #include<math.h> using namespace std; int n=8; int total=0; int *c=new int(n); //下标为行数,存的数为列数 bool is_ok(int row

用试探回溯法解决N皇后问题

学校数据结构的课程实验之一. 数据结构:(其实只用了一个二维数组) 算法:深度优先搜索,试探回溯 需求分析: 设计一个在控制台窗口运行的“n皇后问题”解决方案生成器,要求实现以下功能: 由n*n个方块排成n行n列的正方形称为n元棋盘.如果两个皇后位于n元棋盘上的同一行.同一列或同一对角线上,则称它们在互相攻击.现要找出使棋盘上n个皇后互不攻击的布局. 编制程序解决上述问题,以n=6运行程序,输出结果. 算法解释: 首先试探当前行第一个可用的位置(列.对角线没有被占领),摆放皇后之后,试探下一行的

回溯算法之8皇后问题

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SeqListSort { /// <summary> /// 8皇后算法 /// <ather> /// <lihonglin> /// </ather> /// </summary> class EightQueen { private const in

回溯法解决N皇后问题

以4皇后为例,其他的N皇后问题以此类推.所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子.在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平.竖直.以及45度斜线上都不能出现皇后的棋子     1   1             1   1