利用回溯法解决八皇后问题(循环)

独自空忆成欢 提交于 2020-03-17 08:02:45

利用回溯法解决八皇后问题(循环)

2.用循环解决

#include <stdio.h>
#include <stdlib.h>

int a[20],n,sum;
void output()//输出
{
    int i,j;
    for(i = 1; i<=n; i++)
    {
        for(j = 1; j<=n; j++)
        {
           if(a[i]==j)
               printf("  Q");
           else
               printf("  *");
        }
        printf("\n");
    }
    printf("\n");
}
int check(int k)//检查当前位置是否可放
{
    int i;
    for(i = 1; i<=k-1; i++)
    //abs(a[i] - a[k])==abs(i - k))用于判断当前位置是否在前面任一皇后的左下斜线或右下斜线方向
    //(a[i]==a[k])用于判断当前位置是否在前面任一皇后的正下方
        if( (abs(a[i] - a[k])==abs(i - k)) || (a[i]==a[k]) )
            return 0;//不可以放
    return 1;//可以放
}
void backdate(int n)
{
    int k;
    a[1] = 0;
    k = 1;
    while(k>0)
    {
        a[k] = a[k] + 1;
        while((a[k]<=n) && (check(k)==0) )    //为第k个皇后搜索位置
            a[k] ++;//如果不可放,则皇后往右放一个位置,直到可放或者 位置>n,跳出循环
        if(a[k]<=n)//如果可放
            if(k==n)             //找到n个皇后的一种放置方法
            {
               output();
               sum ++;
            }
            else
            {
               k ++;         //第k个皇后找到位置,继续为第k+1个皇后找位置
               a[k] = 0;           //注意下一个皇后一定要从头开始搜索
            }
        else//否则回到上一个皇后的摆放情况
            k --;             //回溯
    }
}
int main()
{
    int i;
    scanf("%d",&n);
    sum = 0;
    for(i = 0; i < 20; i++)
        a[i] = 0;
    backdate(n);
    printf("共有%d种方案\n",sum);
    return 0;
}

注:
也可把void backdate(int n)函数里面的while分离,取消backdate函数,稍作改变也可改为递归的形式求解。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!