8皇后问题

/*  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 : %d\n",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;                        
}









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值