Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1530906
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2010-01-15 12:31:08

void queen(int n)
{
    //初始化N+1个元素是为了编程直观,第一元素不使用
    int *col =new int[n+1];        //col[m]=n 表示第m列,第n行放置皇后
    int *a   =new int[n+1];        //a[k] = 1 表示第k行上没有皇后
    int *b   =new int[2*n+1];    //b[k] = 1 表示第k条主对角线上没有皇后
    int *c   =new int[2*n+1];    //c[k] = 1 表示第k条次对角线上没有皇后
    int j;
    for(j=0;j<=n;j++)
        a[j] = 1;
    for(j=0;j<=2*n;j++)
        b[j] = c[j] =1;
    int m = 1;            //从第一列开始(0不用)
    col[1] = 1;            //初始第一列,第一行放上皇后
    int good = 1;            
    col[0] = 0;
    char awn;
    do{
        if(good)
        {
            if(m==n)        //已经找到一个解
            {
                printf("列\t\t行\n");
                for(j=1;j<=n;j++)
                    printf("%d\t\t%d\n",j,col[j]);
                printf("Enter a character(Q/q for exit)!\n");
                scanf("%c",&awn);
                if(awn == 'Q'||awn == 'q')
                    exit(0);
                while(col[m]==n)    //如果本列试探完毕,则回溯
                {
                    m--;        //回溯
                    //标记m列col[m]行处没有皇后(所在行,对角线,次对角线上都没有皇后)
                    a[col[m]] = b[m+col[m]]=c[n+m-col[m]]=1;
                }
                col[m]++;        //继续试探本列其他行
            }else{                //当前列的放置皇后满足要求,但还没找到解,继续
                a[col[m] ] = b[m+col[m]] = c[n+m-col[m]]=0; //标志当前位置已经放置皇后
                col[++m] = 1;        //转到下列第一行
            }
        }else{
            while(col[m]==n)    //第m列选择已经到了最后一行,所以回溯到上一列
            {
                m--;        //回溯到上一列
                a[col[m]] = b[m+col[m]]=c[n+m-col[m]]=1;//标记没有皇后
            }
            col[m]++;        //试探其他行
        }
        good = a[col[m]] && b[m+col[m]]&&c[n+m-col[m]];    //检查是否满足要求
    }while(m!=0);
}
阅读(2468) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~