欢迎使用CSDN-markdown编辑器

ACM-ICPC 2014 WF problem a

构造,需要有3,4,5,6,7的特例,然后n就可以转化为n-4的解

6,7 的解凑了好久,然后3 也凑了好久,最后编程穷举算出来。。。

直接上代码吧

#include <iostream>
using namespace std;


void out(int a, int b)
{
    cout << a << " to " << b << endl;
}

int fuck(int s,int n)
{
    if (n == 3)
    {
        int s0 = s-1;
        out(s0 + 2, s0 - 1);
        out(s0 + 5, s0 + 2);
        out(s0 + 3, s0 - 3);
        return 0;
    }
    if (n == 4)
    {
        int s0 = s - 1;
        out(s0 + 6, s0 - 1);
        out(s0 + 3, s0 + 6);
        out(s0 + 0, s0 + 3);
        out(s0 + 7, s0 + 0);
        return 0;
    }
    if (n == 5)
    {
        int s0 = s - 1;
        out(s0 + 8, s0 - 1);
        out(s0 + 3, s0 + 8);
        out(s0 + 6, s0 + 3);
        out(s0 + 0, s0 + 6);
        out(s0 + 9, s0 + 0);
        return 0;
    }
    if (n == 6)
    {
        int s0 = s - 1;
        out(s0 + 10, s0 - 1);
        out(s0 + 7, s0 + 10);
        out(s0 + 2, s0 + 7);
        out(s0 + 6, s0 + 2);
        out(s0 + 0, s0 + 6);
        out(s0 + 11, s0 + 0);

        return 0;
    }
    if (n == 7)
    {
        int s0 = s - 1;
        out(s0 + 12, s0 - 1);
        out(s0 + 5, s0 + 12);
        out(s0 + 8, s0 + 5);
        out(s0 + 3, s0 + 8);
        out(s0 + 9, s0 + 3);
        out(s0 + 0, s0 + 9);
        out(s0 + 13, s0 + 0);
        return 0;
    }
    int s0 = s - 1;
    int end = 2 * n+s0;
    out(end - 2, s0 - 1);
    out(s0 + 3, end - 2);
    fuck(s+4,n-4);
    out(s0 + 0, end - 5);
    out(end - 1, s0 + 0);
    return 0;
}

int main()
{
    int n;
    while (cin >> n) {
        fuck(1, n);
        cout << endl;
    }   
}
点赞