poj3091

题意:给一个三脚阵,第i行有i个点。皇后可以攻击三脚阵中六方向上的所有点,给定三脚阵的边长n,已知最多可以放floor((n * 2 + 1) / 3)个互不冲突的皇后,要求给出一种方案。

分析:根据题中数据找规律,进行构造,n<3的是特殊情况,每个点坐标用两个值表示,[i,j]表示第i行的第j个点,我们发现把这(n * 2 + 1) / 3个放皇后的坐标,从右往左看,发现i是从n开始每次递减1。从左往右看j的变化规律是1,3,5,7……2,4,6,8……,先奇数从1递增,然后偶数从2递增,那么分界线在哪呢?就是i>=j的时候是奇数,i增长慢但起点高,j增长快但起点底,j必然在某一点超越i,在超越之前j是奇数,超越之后j是偶数。

View Code
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int main()
{
    //freopen("t.txt", "r", stdin);
    int t;
    scanf("%d", &t);
    for (int i = 0; i < t; i++)
    {
        int n;
        int cnt = 0;
        scanf("%d", &n);
        if (n < 3)
        {
            printf("%d %d 1\n[1,1]\n\n", i + 1, n);
            continue;
        }
        printf("%d %d %d\n", i + 1, n, (2 * n + 1) / 3);
        int a = n - (2 * n + 1) / 3 + 1;
        int b = 1;
        while (b <= a)
        {
            printf("[%d,%d] ", a, b);
            cnt++;
            if (cnt % 8 == 0)
                puts("");
            b += 2;
            a++;
        }
        b = 2;
        while (a <= n)
        {
            printf("[%d,%d] ", a, b);
            cnt++;
            if (cnt % 8 == 0)
                puts("");
            b += 2;
            a++;
        }
        if (cnt % 8)
            puts("");
        puts("");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/rainydays/p/2775833.html