社区讨论

萌新刚学OI,RE求助

P2730[IOI 1996 / USACO3.2] 魔板 Magic Squares参与者 5已保存回复 21

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
21 条
当前快照
1 份
快照标识符
@locynele
此快照首次捕获于
2023/10/30 21:53
2 年前
此快照最后确认于
2023/11/05 08:15
2 年前
查看原帖
RTRT,不知道为啥RERE惹,求dalao帮忙看看QAQQAQ
CPP
#include<bits/stdc++.h>
    
#define LL long long
    
#define qwq double
    
#define _ 0
    
#define AME__DEBUG
    
#define LOG(FMT...) fprintf(stderr , FMT)
    
using namespace std;
    
/*Grievous Lady*/
    
const int BUF_SIZE = 1 << 12;
    
char buf[BUF_SIZE] , *buf_s = buf , *buf_t = buf + 1;
    
#define PTR_NEXT() \
{ \
    buf_s ++; \
    if(buf_s == buf_t) \
    { \
        buf_s = buf; \
        buf_t = buf + fread(buf , 1 , BUF_SIZE , stdin); \
    } \
}
    
#define mians(_s_) \
{ \
    while(!isgraph(*buf_s)) \
        PTR_NEXT(); \
    char register *_ptr_ = (_s_); \
    while(isgraph(*buf_s) || *buf_s == '-') \
    { \
        *(_ptr_ ++) = *buf_s; \
        PTR_NEXT(); \
    } \
    (*_ptr_) = '\0'; \
}
    
template <typename _n_> void mian(_n_ & _x_){
    char buf_s; while(buf_s != '-' && !isdigit(buf_s)) buf_s = getchar();
    bool register _nega_ = false; if(buf_s == '-'){ _nega_ = true; buf_s = getchar(); }
    _x_ = 0; while(isdigit(buf_s)){  _x_ = _x_ * 10 + buf_s - '0'; buf_s = getchar(); } if(_nega_) _x_ = -_x_;
}
    
const int kato = 1e6 + 10;

template <typename _n_> bool cmax(_n_ &a , const _n_ &b){ return a < b ? a = b , 1 : 0; }
    
template <typename _n_> bool cmin(_n_ &a , const _n_ &b){ return a > b ? a = b , 1 : 0; }
    
int tot , yuni[10] , base[10] , ans[kato];

struct node{
    int x;
    array<int , 10> qaq;
};

map<array<int , 10> , node> pre;

map<array<int , 10> , int> dis;

inline array<int , 10> get_A(array <int , 10>a){
    array<int , 10> rev;
    for(int i = 1;i <= 4;i ++) rev[i] = a[i + 4];
    for(int i = 5;i <= 8;i ++) rev[i] = a[i - 4];
    return rev;
}

inline array<int , 10> get_B(array<int , 10> a){
    array<int , 10> rev;
    rev[1] = a[4]; 
    for(int i = 2;i <= 4;i ++) rev[i] = a[i - 1];
    rev[5] = a[8];
    for(int i = 6;i <= 8;i ++) rev[i] = a[i - 1];
    return rev;
}

inline array<int , 10> get_C(array<int , 10> a){
    array<int , 10> rev;
    rev[1] = a[1] , rev[4] = a[4] , rev[5] = a[5] , rev[8] = a[8];
    rev[2] = a[6] , rev[3] = a[2] , rev[6] = a[7] , rev[7] = a[3];
    return rev;
}

inline bool judge(array<int , 10> a , array<int , 10> b){
    for(int i = 1;i <= 8;i ++) if(a[i] != b[i]) return 0;
    return 1;
}

inline int BFS(array<int , 10> a , array<int , 10> b){
    if(judge(a , b)) return 0;
    queue<array<int , 10> > q;
    array<int , 10> rev1 , rev2 , rev3 , u;
    q.push(a); dis[a] = 0;
    while(!q.empty()){
        u = q.front(); q.pop();
        rev1 = get_A(u); rev2 = get_B(u); rev3 = get_C(u);
        for(int i = 1;i <= 3;i ++){
            if(i == 1){
                if(!dis.count(rev1)){
                    dis[rev1] = dis[u] + 1; pre[rev1] = (node){1 , u};
                    q.push(rev1);
                    if(judge(rev1 , b)) return dis[rev1];
                }
            }else if(i == 2){
                if(!dis.count(rev2)){
                    dis[rev2] = dis[u] + 1; pre[rev2] = (node){2 , u};
                    q.push(rev2);
                    if(judge(rev2 , b)) return dis[rev2];
                }
            }else{
                if(!dis.count(rev3)){
                    dis[rev3] = dis[u] + 1; pre[rev3] = (node){3 , u};
                    q.push(rev3);
                    if(judge(rev3 , b)) return dis[rev3];
                }
            }
        }
    }
    return 114514;
}

/*BCABCCB*/

inline int Ame_(){
#ifdef AME__
    freopen(".in" , "r" , stdin); freopen(".out" , "w" , stdout); int nol_cl = clock();
#endif
    for(int i = 1;i <= 8;i ++) mian(yuni[i]);
    swap(yuni[5] , yuni[8]); swap(yuni[6] , yuni[7]);
    for(int i = 1;i <= 4;i ++) base[i] = i;
    base[5] = 8 , base[6] = 7 , base[7] = 6 , base[8] = 5;
    array<int , 10> rev1 , rev2;
    for(int i = 1;i <= 8;i ++) rev2[i] = base[i] , rev1[i] = yuni[i];
    tot = BFS(rev2 , rev1);
    printf("%d\n" , tot); int tot1 = tot;
    while(!judge(rev2 , rev1)){
        ans[tot1 --] = pre[rev1].x;
        rev1 = pre[rev1].qaq;
    }
    for(int i = 1;i <= tot;i ++) ans[i] == 1 ? printf("A") : ans[i] == 2 ? printf("B") : printf("C");
#ifdef AME__TIME
    LOG("Time: %dms\n", int((clock() - nol_cl) / (qwq)CLOCKS_PER_SEC * 1000));
#endif
    return ~~(0^_^0);
}
    
int Ame__ = Ame_();
    
int main(){;}

/*
2 6 8 4 5 7 3 1
*/

回复

21 条回复,欢迎继续交流。

正在加载回复...