//
// 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");
}
相关推荐
### 八皇后问题C语言解法 #### 一、八皇后问题概述 八皇后问题是一个经典的问题,在棋盘上放置八个皇后,要求任何两个皇后不能处于同一行、同一列或同一对角线上。该问题可以扩展到任意大小的棋盘(N皇后问题),...
八皇后问题是一个经典的问题,在棋盘上放置八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。这个问题最早由19世纪的数学家马克斯·贝瑟尔提出,后来成为了算法设计和回溯法的经典...
八皇后问题的C语言解法,使用VS 2013编译通过并验证。
该问题要求在一个8×8的国际象棋棋盘上放置八个皇后,使得任意两个皇后都不在同一行、同一列或同一对角线上。这是一个典型的组合问题,涉及排列与组合的数学原理。 #### 解决方案分析 给定代码片段提供了一个基于...
### 8皇后问题的两种解法(C语言描述) #### 方法一:回溯法 **回溯法**是一种通过尝试解决子问题,并且能够“撤销”答案的算法。8皇后问题是一个经典的计算机科学问题,其目标是在一个8×8的棋盘上放置8个皇后,...
解决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) //...
问题的核心是:如何在8×8的棋盘上放置8个皇后,使得任意两个皇后都无法通过直线互相攻击,即任意一行、一列或对角线都不能有两个皇后。这是一个典型的回溯算法应用实例,它涉及到位操作、数组和循环控制等基础知识...
为了更好地理解这个问题,我们可以设想一个一维数组p,其长度与皇后数量N相等。数组中的每个元素p[k]对应于棋盘的第k+1行的皇后位置,表示该皇后所在的列号。这样,通过数组p我们就能追踪每一行皇后的位置,进而判断...
这个是八皇后问题的一种解法,希望可以给大家参考,有需要的话可以看一下哦!
八皇后问题是一个经典的问题,在国际象棋中,如何在8×8的棋盘上放置八个皇后,使得任意两个皇后都不会互相攻击?根据国际象棋规则,皇后可以沿着横行、竖行以及对角线移动,因此,我们需要找到一种布局方法,让这八...
八皇后问题是一种回溯思想的体现,可以用C语言里面的递归算法实现
最新的C语言代码,探索八皇后的解法 程序已经过精心调试,没有错误,请大家分享
八皇后问题要求在一个8×8的棋盘上放置8个皇后,使得这些皇后彼此之间不会相互攻击,即任意两个皇后都不能处在同一行、同一列或相同的对角线上。 ##### (二)解的性质 1. **唯一性**:每个解都是唯一的,不存在...
八皇后问题是一个经典的问题,在棋盘上放置八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种不同的放置方法。这是一个典型的回溯算法的应用,对于学习和理解计算机算法...
这个问题展示了如何通过编程来解决约束冲突的问题,对于理解和实践算法有着重要的意义。 在这个“N皇后问题 c++ 窗体演示(fableboy)”项目中,开发者使用C++编程语言,结合Microsoft Foundation Classes (MFC)库...
这个问题考察了程序员如何有效地解决约束条件下的排列组合问题。 首先,我们从**基本概念**入手。N皇后问题的解法可以看作是棋盘上的皇后布局,其中每个皇后都占据一个格子,且所有皇后都不能相互攻击。棋盘的行和...
2. **八皇后问题的解法**:八皇后问题的解法通常通过递归实现,每次尝试在一个未被占用的列上放置一个皇后,然后检查是否违反了任何规则。如果违反,就撤销这次放置并尝试下一行。如果不违反,继续放置下个皇后,...
本篇文档关注的是两个经典问题——N皇后问题和凸多边形判断,这两个问题都是在C语言环境下进行编程实现的。 N皇后问题是一个经典的回溯法问题,要求在N×N的棋盘上放置N个皇后,使得任意两个皇后都不会在同一行、同...