八皇后问题的递归求解

八皇后问题的递归算法

#include <stdio.h>
#include <stdlib.h>
#define N 8        /* 棋盘边长  */
#define XXN     15 /* 正(反)对角线个数 */
#define TRUE 1
#define FALSE 0
int map[N][N];/* 棋盘     */ 
int col[N];   /* 列       */
int XX[XXN];  /* 正对角线 */
int YY[XXN];  /* 反对角线 */
FILE* fp;
int num=0;  /* 解的个数 */

/**
显示一个解
*/
void showMap()
{

 int i,j;
 fprintf(fp,"n--------------------------n");
 for(i=0;i<N;i++){
   for(j=0;j<N;j++)
    fprintf(fp,"%-3d",map[i][j]);
   fprintf(fp,"n");
  }
}

/**
递归求解函数
*/
int  try(int y)
{
 int i,j;
 int success=FALSE;
 if( y==N){  /* 求出一个解*/
  showMap();
  num++;
  return TRUE;
 }
 for(i=0;i<N;i++){
  if(XX[N-y+i]==0 && YY[i+y]==0 && col[i]==0) /* 保证布局要求; 对角线,列,没有重复放置棋子 */
  {

   XX[N-y+i]=YY[i+y]=col[i]=map[y][i]=1;
   if(try(y+1)) success=TRUE;              /* 放下一个皇后  */  
   XX[N-y+i]=YY[i+y]=col[i]=map[y][i]=0;
  }

 }
 return success;

}

main()
{
 int i,j,result;

 fp=fopen("queen8.txt","w+");
 for(i=0;i<N;i++)
  for(j=0;j<N;j++)
   map[i][j]=0;
 for(i=0;i<XXN;i++) XX[i]=YY[i]=0;

 fprintf(fp,"n start..............");
 if(!try(0))printf("n no resolution!");
 fprintf(fp,"n num=%d",num);

}

时间: 2024-11-09 00:31:49

八皇后问题的递归求解的相关文章

python基于右递归解决八皇后问题的方法

  本文实例讲述了python基于右递归解决八皇后问题的方法.分享给大家供大家参考.具体分析如下: 凡是线性回溯都可以归结为右递归的形式,也即是二叉树,因此对于只要求一个解的问题,采用右递归实现的程序要比回溯法要优美的多. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 def Test(queen,n): '''这个就不用说了吧,就是检验第n(下标,0-7)行皇后的位置是否合理''' q=que

javascript递归回溯法解八皇后问题

  javascript递归回溯法解八皇后问题:           网上看到许多关于八皇后算法的文章,很少能看到使用javascript来实现的,今天就给大家使用javascript来解决下这个问题,有需要的小伙伴可以参考下. 下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

递归-(已解决)自己用java写的八皇后问题算法,可是不行,求告知原因

问题描述 (已解决)自己用java写的八皇后问题算法,可是不行,求告知原因 public class Test { public static void main(String[] args) { Empress a=new Empress(); a.find(0,0); System.out.println(a.map); } } class Empress{ public int[][] arry=new int[8][8]; public int map=0; public boolean

javascript递归回溯法解八皇后问题_javascript技巧

下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了. function NQueens(order) { if (order < 4) { console.log('N Queens problem apply for order bigger than 3 ! '); return; } var nQueens = []; var backTracking = false; rowLoop: for (var row=0; row<order; row++) { //若出现ro

八皇后算法问题

问题描述 问题是下面算法,为什么得不到真确结果?publicclassTest{publicstaticintn=8;//棋盘行列数publicstaticintcount=0;//皇后解法个数publicstaticQueen[]stack=newQueen[n];//皇后栈publicstaticinttop=0;//栈顶//利用栈publicstaticvoidsearch3(){//cur行if(top==n){count++;}else{for(inti=0;i<n;i++){//顺序

C++实现八皇后问题的方法_C 语言

本文实例展示了C++实现八皇后问题的方法,是数据结构与算法中非常经典的一个算法.分享给大家供大家参考之用.具体方法如下: 一般在八皇后问题中,我们要求解的是一个8*8的国际象棋棋盘中,放下8个皇后且互相不能攻击的排列总数.皇后的攻击范围为整行,整列,以及其斜对角线. 由于皇后的攻击范围特性,注定我们每行只能放下一个皇后,于是我们要做的只是逐行放下皇后.八皇后问题是回溯法的典型问题.这里我们用的方法很简单: 从第一行开始逐个检索安全位置摆放皇后,一旦有安全位置则考虑下一行的安全位置.如果发现某行没

UVa 639:Don&#039;t Get Rooked, 类八皇后问题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=580 题目类型: 暴力, 回溯法 题目: In chess, the rook is a piece that can move any number of squares vertically or horizontally. In this p

swift未解决八皇后的问题代码

问题描述 swift未解决八皇后的问题代码 首先提一下八皇后的问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 代码问题:用下面我自己的方法实现的八皇后,结果出现了无尽的循环.可能是思路还是哪里的不严谨?请教大伙帮忙改改!我已经尽力了... 注:代码可以直接粘贴复制进xcode的playground进行测试! class ChessBoard { var limit: Intvar queens = [Queen](

算法-八皇后 递归方法 遇到奇怪问题。。。

问题描述 八皇后 递归方法 遇到奇怪问题... record[0][0] 未被赋值的情况下,前后两次查看,值不一样,运行结果的前两行即是record[0][0],一次是1,一次是0 #include<stdio.h> #include<stdlib.h> int control[8][8]={0}; int record[92][8]={0}; int count=0; int floor=1; int tmp[8]; int p; void setControlArea(int