`
zjjzmw1
  • 浏览: 1367904 次
  • 性别: Icon_minigender_1
  • 来自: 开封
社区版块
存档分类
最新评论

8个皇后问题的C语言的解法。

    博客分类:
  • iOS
阅读更多

//

//  main.m

//  HuangHou

//

//  Created by apple on 14-2-14.

//  Copyright (c) 2014 apple. All rights reserved.

//

//#include<iostream.h>

#include<math.h>

 

#import <Foundation/Foundation.h>

#include "stdio.h"

//#include "windows.h"

#define N 8/* 定义棋盘大小 */

int place(int k); /* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */

void backtrack(int i);/* 主递归函数,搜索解空间中第i层子树 */

void chessboard(); /* 每找到一个解,打印当前棋盘状态 */

staticint sum, /* 当前已找到解的个数 */

x[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i] */

int main(int argc, const char * argv[])

{

    @autoreleasepool {

        backtrack(0);

        system("pause");

    }

    return 0;

}

 

int place(int k)

{

    /* 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。 x[j] == */

    /* x[k] 时,两皇后在同一列上;abs(k - j) == abs(x[j] - x[k]) 时,两皇 */

    /* 后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件。*/

    for (int j = 0; j < k; j ++)

        if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k])) return 0;////这里只判断了两个相减的情况,相加的都不用判断,因为for循环的时候说了。小于,没有等于。。。。

    return 1;

}

void backtrack(int t)

{

    /* t == N 时,算法搜索至叶结点,得到一个新的N皇后互不攻击的放置方案 */

    if (t == N) chessboard();

    else

        for (int i = 0; i < N; i ++) {

            x[t] = i;

            if (place(t)) backtrack(t + 1);///当前行有几种方法,就递归几次。。。

        }

}

 

void chessboard()

{

    printf("%d种解法:\n", ++ sum);

    for (int i = 0; i < N; i ++) {

        for (int j = 0; j < N; j ++)

            if (j == x[i]) printf("@ "); 

            else printf("* "); 

        printf("\n"); 

    } 

    printf("\n"); 

 

}

1
0
分享到:
评论

相关推荐

    八皇后问题C语言解法

    ### 八皇后问题C语言解法 #### 一、八皇后问题概述 八皇后问题是一个经典的问题,在棋盘上放置八个皇后,要求任何两个皇后不能处于同一行、同一列或同一对角线上。该问题可以扩展到任意大小的棋盘(N皇后问题),...

    八皇后问题C语言源代码

    八皇后问题是一个经典的问题,在棋盘上放置八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。这个问题最早由19世纪的数学家马克斯·贝瑟尔提出,后来成为了算法设计和回溯法的经典...

    八皇后问题的C语言程序

    八皇后问题的C语言解法,使用VS 2013编译通过并验证。

    八皇后问题C解法

    该问题要求在一个8×8的国际象棋棋盘上放置八个皇后,使得任意两个皇后都不在同一行、同一列或同一对角线上。这是一个典型的组合问题,涉及排列与组合的数学原理。 #### 解决方案分析 给定代码片段提供了一个基于...

    8皇后问题的两种解法(c语言描述)

    ### 8皇后问题的两种解法(C语言描述) #### 方法一:回溯法 **回溯法**是一种通过尝试解决子问题,并且能够“撤销”答案的算法。8皇后问题是一个经典的计算机科学问题,其目标是在一个8×8的棋盘上放置8个皇后,...

    n皇后问题解法

    解决n皇后的代码 #include #include #include #define _PRINT_ 0//没有输出具体的解,只是计算了总数。 #define MAXQ 100 long N, t; long qx[MAXQ], qy[MAXQ]; long quse; /* */ bool chk(int x, int y) //...

    八皇后算法C语言实现

    问题的核心是:如何在8×8的棋盘上放置8个皇后,使得任意两个皇后都无法通过直线互相攻击,即任意一行、一列或对角线都不能有两个皇后。这是一个典型的回溯算法应用实例,它涉及到位操作、数组和循环控制等基础知识...

    C语言实现N皇后问题非递归求解

    为了更好地理解这个问题,我们可以设想一个一维数组p,其长度与皇后数量N相等。数组中的每个元素p[k]对应于棋盘的第k+1行的皇后位置,表示该皇后所在的列号。这样,通过数组p我们就能追踪每一行皇后的位置,进而判断...

    八皇后问题的一种解法(C语言源代码)

    这个是八皇后问题的一种解法,希望可以给大家参考,有需要的话可以看一下哦!

    八皇后问题(扩展N皇后).(C语言源码)

    八皇后问题是一个经典的问题,在国际象棋中,如何在8×8的棋盘上放置八个皇后,使得任意两个皇后都不会互相攻击?根据国际象棋规则,皇后可以沿着横行、竖行以及对角线移动,因此,我们需要找到一种布局方法,让这八...

    八皇后递归解法

    八皇后问题是一种回溯思想的体现,可以用C语言里面的递归算法实现

    C语言版本的八皇后源代码

    最新的C语言代码,探索八皇后的解法 程序已经过精心调试,没有错误,请大家分享

    回溯法解决八皇后问题

    八皇后问题要求在一个8×8的棋盘上放置8个皇后,使得这些皇后彼此之间不会相互攻击,即任意两个皇后都不能处在同一行、同一列或相同的对角线上。 ##### (二)解的性质 1. **唯一性**:每个解都是唯一的,不存在...

    八皇后问题

    八皇后问题是一个经典的问题,在棋盘上放置八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种不同的放置方法。这是一个典型的回溯算法的应用,对于学习和理解计算机算法...

    N皇后问题 c++ 窗体演示(fableboy)

    这个问题展示了如何通过编程来解决约束冲突的问题,对于理解和实践算法有着重要的意义。 在这个“N皇后问题 c++ 窗体演示(fableboy)”项目中,开发者使用C++编程语言,结合Microsoft Foundation Classes (MFC)库...

    n皇后问题_N皇后问题_源码

    这个问题考察了程序员如何有效地解决约束条件下的排列组合问题。 首先,我们从**基本概念**入手。N皇后问题的解法可以看作是棋盘上的皇后布局,其中每个皇后都占据一个格子,且所有皇后都不能相互攻击。棋盘的行和...

    回溯法_皇后问题

    2. **八皇后问题的解法**:八皇后问题的解法通常通过递归实现,每次尝试在一个未被占用的列上放置一个皇后,然后检查是否违反了任何规则。如果违反,就撤销这次放置并尝试下一行。如果不违反,继续放置下个皇后,...

    N皇后与凸多边形C语言设计流程思路与源代码.doc

    本篇文档关注的是两个经典问题——N皇后问题和凸多边形判断,这两个问题都是在C语言环境下进行编程实现的。 N皇后问题是一个经典的回溯法问题,要求在N×N的棋盘上放置N个皇后,使得任意两个皇后都不会在同一行、同...

Global site tag (gtag.js) - Google Analytics