P1219 [USACO1.5]八皇后 Checker Challenge

P1219 [USACO1.5]八皇后 Checker Challenge_第1张图片

P1219 [USACO1.5]八皇后 Checker Challenge_第2张图片

 

#include 
#include 
#include
#include
#pragma warning(disable:4996)
using namespace std;
int k = 0;//计算答案个数

int place[20];//下标表示行,内容表示列
int cow[20];//列
int d1[20];//上对角线标记方法  下标 行 - 列 + 7    内容 为 1 表示  这个对角线被标记 
int d2[20];//下对角线标记方法   下标  行 + 列
//回溯的意义在于要求出 所有的解

void print(int n)
{
    k++;//能到这里说明有解
    if (k <= 3)
    {
        int i = 0;
        for (i = 1; i <= n; i++)//一共n行
        {
            printf("%d ", place[i]);
        }
        printf("\n");
    }
}
void ans(int h, int n)//h表示行,n表示一共n行
{
    int i = 0;
    for (i = 1; i <= n; i++)//i表示第i列
    {
        //已知具体的一个点,该点所在对角线的点的值都有相同的值  行-列+ 7 
        //那么标记对角线就OK了
        //上图
        if (cow[i] == 0 && d1[i - h + 7] == 0 && d2[i + h] == 0)//如果h行i列未被标记 说明可以放
        {
            place[h] = i;//下标表示h行  内容表示 i列
            cow[i] = 1;//标记第i列
            d1[i - h + 7] = 1;//标记上对角线
            d2[i + h] = 1;//标记下对角线
            if (h < n)//当不是最后一行的时候,继续探索
            {
                ans(h + 1, n);
            }
            else//最后一行打印答案
            {
                print(n);
            }
            cow[i] = 0;//回溯
            d1[i - h + 7] = 0;
            d2[i + h] = 0;
        }
    }
}


int main()
{
    int n = 0;
    cin >> n;
    ans(1, n);
    printf("%d", k);
    return 0;
}

你可能感兴趣的:(蓝桥杯,算法,职场和发展)