百度空间 | 百度首页 
 
查看文章
 
八皇后的递归与非递归解
2009-10-10 09:22

1、递归。递归真是个好东西,解法一目了然。

#include<stdio.h>
#define N 8

int l[14];
int r[14];
int q[N];
int col[N];
static int cnt = 0;

void try(int i)
{
int j;

for(j=0; j<N; j++)
{
if(l[i+j] == 0 && r[i-j+7] ==0 && col[j] == 0)
{
l[i+j]=1;
r[i-j+7] =1;
col[j] = 1;
q[i] = j;

    if(i+1 == N)
{
++cnt;
//    return;
}
else
{
try(i+1);
}

     l[i+j] = 0;
r[i-j+7] = 0;
col[j] = 0;
q[i] = -1;
}
}
}

int main()
{
int i;
for(i=0; i<14; i++)
{
l[i] = 0;
r[i] = 0;

}
for(i = 0; i<N; i++)
{
col[i] = 0;
q[i] = -1;
}
try(0);
printf("cnt = %d\n", cnt);
return 0;
}

2、非递归解

#include <iostream.h>
#define QUEEN 8 //皇后数量
int queen[QUEEN] ; //下标代表所在列号,值代表所在行号,
//如queen[1]=2表示第1列第2行有个皇后
bool col_YN[QUEEN] ;      //棋局的每一行是否有棋,有则为1,无为0 ;
bool passive_YN[2*QUEEN-1] ; //斜率为1的斜线方向上是否有棋,共有2*QUEEN-1个斜线
bool negative_YN[2*QUEEN-1] ; //斜率为负1的斜线方向上是否有棋
//用全局变量,因全局数组元素值自动为0
int main()
{
int col = 0 ;//游标,当前移动的棋子(以列计)
bool flag = false ;   //当前棋子位置是否合法
queen[0] = -1 ;      //第0列棋子准备,因一开始移动的就是第0列棋子
int count = 0 ;      //一共有多少种解法的计数器 ;

while(col>=0 ) //跳出条件是回溯到无法回溯时
{
queen[col]++ ;      //col列上的皇后走到下一行试试
if(queen[col] >= QUEEN) //当前列全部走完
{
queen[col] = -1 ; //当前列棋子置于准备状态
col-- ;        //回溯到上一列的棋子
if(col>=0)      //回溯时要清理如下行,斜线的标志位  
{
col_YN[queen[col]] = false ;
passive_YN[queen[col] + col] = false ;
negative_YN[QUEEN-1 + col - queen[col]] = false ;
}
}
else
{
//先判断棋子所在行没有棋子
if(col_YN[queen[col]] == false)
{
flag = true ;
//以下检查当前棋子是否与之前的棋子斜线相交
if( passive_YN[queen[col] + col] == true || negative_YN[QUEEN-1 + col -      queen[col]] == true)
flag = false ;
else    
flag = true ;
if(flag) // flag为真表示位置合法
{
if(col == QUEEN-1) //列到达最后,即最后一个皇后也找到位置,输出解
{
count++ ; //解法的数目加一 ;
cout<<"***第"<<count<<"种解法***"<<endl ;
for(int i=0;i<QUEEN;i++)
cout<<"第"<<i<<"列皇后在第"<<queen[ i ]<<"行"<<endl;
}
col_YN[queen[col]] = true ;// 当前行设为有棋子
passive_YN[queen[col] + col] = true ;//当前行正斜率方向有棋子
negative_YN[QUEEN-1 + col - queen[col]] = true ; //当前行负斜率方向                   上也有棋子
col++ ;
if(col >= QUEEN)
{ // 找到解后再次回溯找另外的解,这同上面无解回溯是一样的
col-- ;
col_YN[queen[col]] = false ;
passive_YN[queen[col] + col] = false ;
negative_YN[QUEEN-1 + col - queen[col]] = false ;//原理同回溯
}     
flag = false ;    
}
}
}
}
cout<<QUEEN<<"皇后问题一共有"<<count<<"种解法"<<endl ;
return 0 ;
}

类别:算法 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu