NOJ(1007)-回溯算法-8皇后问题

问题描述

输出8皇后问题所有结果。

输入

没有输入

输出

每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。

输入样例
输出样例

部分输出结果

代码如下;
# include <stdio.h>
#define N 8
#define false 0
#define true 1

int cnt;//存放解决方案数
int q[10]={0};//存放每个皇后的位置信息,初始化为0

void queen(int k);
int check(int k, int col);//检查将皇后K放在每一行的col位置是否可行
void print();//打印每组解
int abs(int n);

 int main()
 {
    search_time=0;
    cnt=0;
    queen(1);//从第一个皇后开始检索
    return 0;
 }

 void queen(int k)
 {
    int i;
    if(k==N+1)//N+1表示最后的皇后存放的位置也是合法的
    {
        cnt++;//解决方案数+1
        print();
        return ;//返回上一层,回到i-1,即上一个皇后的状态
    }

    for(i=1;i<=N;i++)//依次判断每一行的每个位置是否合法
        if(check(k,i))
        {
            q[k]=i;//合法,则将此时的位置信息存放在数组q[]中
            queen(k+1);//检索下一个皇后
            q[k]=0;//恢复状态
        }
 }

 int check(int k, int col)
 {
    int i;
    for(i=1;i<=k;i++)//当前皇后的位置信息依次与前面的皇后进行比对
        if(abs(k-i)==abs(col-q[i])||col==q[i])//斜对角应用等腰三角形的特征
            return false;
    return true;
 }

 void print()
 {
    int i,j;
    printf("No %d:\n",cnt);
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=N;j++)
    {
        if(q[i]==j)
        printf("A");
        else printf(".");
    }
    printf("\n");
    }
 }

 int abs(int n)
 {
    if(n<0)
        return -n;
    else return n;
 }



总结:

  • 一个好习惯:把所有函数申明放在开头。
  • 此题虽然最后的输出看起来是二维数组形式,但是,如果此题采用的是用一个一维数组q[ ],来存储皇后的位置。实际上,每得到一组解时,数组q[ ]就是一串由1~8组成的数,这个数上的第i位数j就代表着i皇后所处的第i行的第j列。以示例的第一个输出为例,此时数组q[ ]就是{1、5、8、6、3、7、2、4}。
  • 本题对格式的控制较严格,例如:每行输出的最后不能带空格、No x:处的空格、数字、冒号等都得注意。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值