组队练习赛(Regionals 2012, North America - East Central NA)

A.Babs' Box Boutique

给定n个盒子,每个盒子都有长宽高(任意两个盒子长宽高不完全相同),现在选盒子的任意两面,要求x1 <= x2 && y1 <= y2,问最多能选多少盒子满足这需求。

直接dfs暴搞................

 

#include <cstdio>

#include <cstring>

#include <string>

#include <iostream>

#include <cmath>

#include <algorithm>

#include <map>

# define INF 0x7FFFFFFF

using namespace std;

int vis[11];

struct node {

    int a[3];

}p[11];

int ans,n;

int dx[] = {0,0,1};

int dy[] = {1,2,2};

//bool cmp(int a,int b) {

//    return a > b;

//}



void dfs(int step,int x,int y) {

    if(step > ans) ans = step;

    if(step == n) return ;

    for(int i=0; i<n; i++) {

        if(vis[i] == 1) continue;



        for(int j=0; j<3; j++) {

            int xx = p[i].a[dx[j]];

            int yy = p[i].a[dy[j]];

            if(xx >= x && yy >= y ) {

                vis[i] = 1;

                dfs(step + 1,xx,yy);

                vis[i] = 0;

            }

        }

    }

}



int main() {

    int casee = 1;

    while(scanf("%d",&n) && n) {

        if(n == 0) break;

        int tmp[3];

        for(int i=0; i<n; i++) {

            scanf("%d%d%d",&tmp[0],&tmp[1],&tmp[2]);

            sort(tmp,tmp+3);

            p[i].a[0] = tmp[0];

            p[i].a[1] = tmp[1];

            p[i].a[2] = tmp[2];

        }

        ans = 0;

        memset(vis,0,sizeof(vis));

        dfs(0,0,0);

        printf("Case %d: %d\n",casee++,ans);

    }

    return 0;

}


 

C.Hexagon Perplexagon

题意就不写了:戳这

dfs暴搞,每一层传入三个参数,层数, 每一块需要匹配的前驱点,和最后一块需要匹配的点..........

 

#include <iostream>

#include <stdio.h>

#include <cstring>

#include <cmath>

#include <algorithm>

#include <vector>

#include <queue>

using namespace std;

int map[8][8];

int ans[8];

int save[8];

int vis[8];

int n,ok;



void change(int x,int pos) {

    int i;

    for(i=0; i<6; i++) {

        if(map[x][i] == pos) break;

    }

    pos = i;

    int cnt = 0;

    for(int i=0; i<6; i++) {

        save[cnt++] = map[x][pos];

        pos ++;

        if(pos >= 6) pos -= 6;

    }

}



int getpre(int pos,int t) {

    t --;

    if(t < 0) t = 5;

    return map[pos][t];

}



int getsuc(int pos,int t) {

    t ++;

    if(t > 5) t = 0;

    return map[pos][t];

}



void dfs(int step,int p1,int p2) {

    if(step == 7) return ;

    if(ok == 1) return ;

    for(int i=0; i<7; i++) {

        if(vis[i] == 1) continue;

        int j;

        for(j=0; j<6; j++) {

            if(map[i][j] == save[step-1]) break;

        }

        int tmp1 = getpre(i,j);

        int tmp2 = getsuc(i,j);

        if(step == 1) {

            ans[step] = i;

            vis[i] = 1;

            dfs(step + 1,tmp1,tmp2);

            vis[i] = 0;

        }

        if(step > 1 && step < 6) {

            if(tmp2 == p1 ) {

                ans[step] = i;

                vis[i] = 1;

                dfs(step+1,tmp1,p2);

                vis[i] = 0;

            }

        }

        if(step == 6) {

            if(tmp2 == p1 && tmp1 == p2 ) {

                ans[step] = i;

                ok = 1;

            }

        }

        if(ok == 1) return ;

    }

}

int main() {

    int T;

    cin >> T;

    int casee = 1;

    while(T --) {

        for(int i=0; i<7; i++) {

            for(int j=0; j<6; j++) {

                scanf("%d",&map[i][j]);

            }

        }

        ok = 0;

        for(int i=0; i<7; i++) {

            memset(vis,0,sizeof(vis));

            vis[i] = 1;

            change(i,1);

            ans[0] = i;

            dfs(1,0,0);

            if(ok) break;

        }

        printf("Case %d: ",casee++);

        if(ok == 0) {

            printf("No solution\n");

            continue;

        }

        printf("%d",ans[0]);

        for(int i=1; i<7; i++) {

            printf(" %d",ans[i]);

        }

        puts("");

    }

    return 0;

}

 


D.I've Got Your Back(gammon)

暴搞,每一种排列分别保存它的各个点的情况,并且用map保存每种排列的顺序下标


 

#include <cstdio>

#include <cstring>

#include <string>

#include <iostream>

#include <cmath>

#include <map>

using namespace std;

struct node

{

    int pos[10];

} p[20000];



map <string,int>mm;

int cnt ;

string str = "";

string str2 = "";

string change(int x)

{

    str = "";

    str2 = "";

    if(x == 0)

    {

        str += '0';

        return str;

    }

    int cn = 0;

    while(x)

    {

        int t = x % 10;

        str += t + '0';

        x = x / 10;

    }

    int len = str.length();

    for(int i=len-1; i>=0; i--) str2 += str[i];

    str2 += '\0';

    return str2;

}

void init()

{

    cnt = 0;

    for(int i=0; i<=15; i++)

    {

        for(int j=0; j<=15; j++)

        {

            for(int k=0; k<=15; k++)

            {

                for(int l=0; l<=15; l++)

                {

                    for(int x=0; x<=15; x++)

                    {

                        for(int y=0; y<=15; y++)

                        {

                            int t = i + j + k + l + x + y;

                            if(t > 15) break;

                            if(t == 15)

                            {

                                string tmp;

                                p[cnt].pos[0] = i;

                                p[cnt].pos[1] = j;

                                p[cnt].pos[2] = k;

                                p[cnt].pos[3] = l;

                                p[cnt].pos[4] = x;

                                p[cnt].pos[5] = y;

                                tmp += change(i);

                                tmp += ' ';

                                tmp += change(j);

                                tmp += ' ';

                                tmp += change(k);

                                tmp += ' ';

                                tmp += change(l);

                                tmp += ' ';

                                tmp += change(x);

                                tmp += ' ';

                                tmp += change(y);



                                mm[tmp] = cnt;

                                cnt ++;

                            }

                        }

                    }

                }

            }

        }

    }

}



int n;

int main()

{

    init();

    char c;

    int a,b,d,e,f,g;

    int casee = 1;

    while(cin >> c)

    {

        if(c == 'e') break;

        printf("Case %d: ",casee++);

        if(c == 'm')

        {

            scanf("%d%d%d%d%d%d",&a,&b,&d,&e,&f,&g);

            string tmp;

            tmp += change(a);

            tmp += ' ';

            tmp += change(b);

            tmp += ' ';

            tmp += change(d);

            tmp += ' ';

            tmp += change(e);

            tmp += ' ';

            tmp += change(f);

            tmp += ' ';

            tmp += change(g);

            //cout << tmp << endl;

            printf("%d\n",mm[tmp]);

        }

        if(c == 'u')

        {

            scanf("%d",&a);

            printf("%d",p[a].pos[0]);

            for(int i=1; i<6; i++)

            {

                printf(" %d",p[a].pos[i]);

            }

            puts("");

        }

    }

    return 0;

}



 

 

你可能感兴趣的:(2012)