首页 > 分享 > 递归解决8皇后问题

递归解决8皇后问题

最新推荐文章于 2024-05-19 19:52:33 发布

it_zujun 于 2014-03-11 21:43:46 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

/*  2014.03.11  8皇后问题  使用递归操作方法               */ 

#include <stdio.h>                // 8 * 8 皇后问题 
#include <stdlib.h>
#define N 8 
typedef  struct _tag_Pos
{
int ios;
int jos;
}Pos;
static count = 0;
static Pos pos[] = { {-1,-1}, {-1,0}, {-1,1}};    //定义的三个方向变量 方便调用

static char board[N+2][N+2];

void init()                                    //建立数学模型  初始化数据  
{
int i;
int j;
for(i=0;i<N+2;i++)              //四个边框用 # 填充 
{
  board[0][i] = '#';
  board[N+1][i] = '#';
  board[i][0] = '#';
  board[i][N+1] = '#';
}

for(i=1;i<N+1;i++)
{
for(j=1;j<N+1;j++)
{
   board[i][j]= ' ';
}    
}
}
void display()          //打印 
{
int i =0;
int j =0;
for(i=0;i<N+2;i++)
{  
for(j=0;j<N+2;j++)
{
        printf("%c",board[i][j]);
}
printf("n");
}
}

int check(int i, int j)           //判断子函数 
{
int ret = 1;
int s = 0;

for(s=0;s<3;s++)
{
  int ni = i;
  int nj = j;
  
  while(ret && ( board[ni][nj] != '#'))     //检测数组不为 #  排除边界问题
  {
ni = ni + pos[s].ios;
nj = nj + pos[s].jos;
ret = ret && (board[ni][nj] != '*');      //合法检测 
  }
}
return ret;      //  ret 的值为 1 或者为 0 
}

void find(int i)
{
int j =0;
    if( i > N )
    {
count++;
printf("The solution is : %dn",count);
display();


}
else
{
  for(j=1;j<=N;j++)
  {
     if(check(i,j))           //如果判断合法 
     {
         board[i][j] = '*';   // 赋值                 
         find(i+1);           //跳到下一行 
         
     board[i][j] = ' ';   // 底层开始赋值 本行其他元素赋值为空 
     }      
  }
}
}

int main()
{

init();   //初始化数组
// display();
find(1);  //找出数据 

return 0;                        
}

相关知识

递归问题题目
算法很美 笔记 2.递归与算法分析
字符串相关问题
基于递归神经网络算法的电子物流配送系统配送路径优化
【SQL】已解决:SQL错误(208):对象名‘STRING
平方项=倒U型?
银皇后万年青怎么养 如何养银皇后万年青
笔试题2019/8/29
银皇后养殖方法
银皇后 室内怎么养,银皇后适合在室内养吗

网址: 递归解决8皇后问题 https://m.huajiangbk.com/newsview1284026.html

所属分类:花卉
上一篇: 银柳的象征意义及文化价值(银柳)
下一篇: 青瓜叶子出现黄褐斑怎么办