Chinaunix首页 | 论坛 | 博客
  • 博客访问: 100801
  • 博文数量: 52
  • 博客积分: 2095
  • 博客等级: 大尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-08 13:29
文章分类

全部博文(52)

文章存档

2010年(1)

2009年(24)

2008年(27)

我的朋友

分类: C/C++

2009-07-30 11:28:31

前面的解法要给非法位置赋值,不如直接判断是否是合法位置,合法就填,这样更清晰。哪种效率高就不知道了

#define N 8
#define true 1
#define false 0
int a[N][N]={{0}}; //0表示没有放棋但还可能放,1表示放下

int num_of_jie=0;

void queen(int row,int n) //处理某一行

{
    int check(int ,int ,int );
    int i,j;

    if (row==n) { //输出

        for(i=0;i<n;i++) {
            for(j=0;j<n ;j++ )
                if(a[i][j]!=1)
                    printf("0");
                else
                    printf("1");
            printf("\n");
        }
        printf("\n");
        num_of_jie++;
    }
    else
      for (i=0;i<n ;i++ )
      {
        if(check(row,i,n)) {
            a[row][i]=1; //通过检查,放棋

            queen(row+1,n); //递归处理下一行

            a[row][i]=0; //恢复这颗棋子的位置为空

        }

     }
}

int check(int row,int col,int n)
{
    int i;
    for(i=1;(row-i)>=0;i++)
        if(a[row-i][col]==1) return false;
    for(i=1;((row-i)>=0)&&((col-i)>=0);i++)
        if(a[row-i][col-i]==1) return false;
    for(i=1;((row-i)>=0)&&((col+i)<n);i++)
        if(a[row-i][col+i]==1) return false;

    return true;
}




int main()
{

    queen(0,N);
    printf("\n共有%d组解\n",num_of_jie);
    return 0;
}

阅读(313) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~