求助,阳历没过
  • 板块P5507 机关
  • 楼主MushR
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/12 22:04
  • 上次更新2024/11/13 05:37:37
查看原帖
求助,阳历没过
621883
MushR楼主2024/11/12 22:04

只写了第一个问

#include<bits/stdc++.h>
using namespace std;

typedef long long llong;

const int N=23,M=2e7+3;

int s;
int a[N][N];

int h(int s){
    int ret=0;
    for(int i=0;i<12;i++)
        if((s>>(i*2))&3)
            ret+=4-((s>>(i*2))&3);
    return ret/2;
}

priority_queue<tuple<int,int,int> > q;

bool vis[M];
int pre[M],ans[M];

int main(){
    #ifdef LOCAL
        freopen(".in","r",stdin);
        freopen(".out","w",stdout);
    #endif
    for(int i=0;i<12;i++){
        int x;
        cin>>x;
        s|=(x-1)<<(i*2);
        for(int j=0;j<4;j++){
            cin>>a[i][j];
            a[i][j]--;
        }
    }
    vis[s]=1;
    q.push({h(s),0,s});
    while(!q.empty()){
        int st=get<2>(q.top()),step=get<1>(q.top());
        q.pop();
        if(st==0){
            cout<<step<<endl;
            return 0;
        }
        for(int i=0;i<12;i++){
            int ns=st;
            int s1=(st>>(i*2))&3;
            int p=a[i][s1];
            int s2=(st>>(p*2))&3;
            ns^=s1<<(i*2);
            ns^=((s1+1)&3)<<(i*2);
            ns^=s2<<(p*2);
            ns^=((s2+1)&3)<<(p*2);
            if(!vis[ns]){
                vis[ns]=1;
                q.push({step+1+h(ns),step+1,ns});
            }
        }
    }
    return 0;
}
‵‵‵
2024/11/12 22:04
加载中...