C++玄学
查看原帖
C++玄学
920098
Jiuweixiansheng楼主2024/1/29 12:37

c++20tle3ge点,c++14直接快到起飞。。。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1 << 24;
int g[N], nxt[12][4], fa[N], ans[20], choice[N];
struct node{
    int st;
    double F;
    node(int s):st(s){
        double h = 0;
        F = 0;
        for(int i=0;i<12;i++){
            if((s>>(i*2))&3)
                h += 4 - ((s>>(i*2))&3);
        }
        F = h + g[s];
    }
    bool operator<(const node &y) const{
        return F > y.F;
    }
};
priority_queue<node>q;
int main(){
    int b, s;
    for(int i=0;i<12;i++){
        cin>>b;
        s |= (b - 1) << (i * 2);
        for(int j=0;j<4;j++){
            cin>>nxt[i][j];
            nxt[i][j] -= 1;
        }
    }
    q.push(node(s));
    while(q.size()){
        int state = q.top().st;
        q.pop();
        if(!state)
            break;
        int si, snxt, nx, nxstate;
        for(int i=0;i<12;i++){
            si = (state>>(i*2))&3;
            nx = nxt[i][si];
            snxt = (state>>(nx*2))&3;
            nxstate = state ^ (si<<(i*2)) ^ (((si+1)&3)<<(i*2));
            nxstate = nxstate ^ (snxt <<(nx*2)) ^ (((snxt+1)&3)<<(nx*2));
            if(!g[nxstate]){
                g[nxstate] = g[state] + 1;
                fa[nxstate] = state;
                choice[nxstate] = i+1;
                q.push(node(nxstate));
            }
        }
    }
    int cnt = 0;
    int state = 0;
    while(state!=s){
        ans[++cnt] = choice[state];
        state = fa[state];
    }
    cout<<cnt<<endl;
    for(int i=cnt;i;i--){
        cout<<ans[i]<<" ";
    }
    return 0;
}
2024/1/29 12:37
加载中...