北京网络赛G BOXES 状态压缩+有序BFS+高维数组判重

Posted 狡啮之仰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了北京网络赛G BOXES 状态压缩+有序BFS+高维数组判重相关的知识,希望对你有一定的参考价值。

#include <bits/stdc++.h>
using namespace std;
int vis1[7];
int vis2[7][7];
int vis3[7][7][7];
int vis4[7][7][7][7];
int vis5[7][7][7][7][7];
int vis6[7][7][7][7][7][7];
int vis7[7][7][7][7][7][7][7];
struct node{
    int a[7];
    int step;
};
bool check(int a[],int num,int step){ //检查有没有走过
    if(num==1){
        if(vis1[a[0]]>=0) return true;
        else{vis1[a[0]]=step;return false;}
    }
    if(num==2){
        if(vis2[a[0]][a[1]]>=0) return true;
        else {vis[a[0]][a[1]]=step;return false;}
    }
    if(num==3){
        if(vis3[a[0]][a[1]][a[2]]>=0) return true;
        else {vis[a[0]][a[1]][a[2]]=step;return false;}
    }
    if(num==4){
        if(vis4[a[0]][a[1]][a[2]][a[3]]>=0) return true;
        else {vis[a[0]][a[1]][a[2]][a[3]]=step;return false;}
    }
    if(num==5){
        if(vis5[a[0]][a[1]][a[2]][a[3]][a[4]]>=0) return true;
        else {vis5[a[0]][a[1]][a[2]][a[3]][a[4]]=step;return false;}
    }
    if(num==6){
        if(vis6[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]]>=0) return true;
        else {vis6[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]]=step;return false;}
    }
    if(num==7){
        if(vis7[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]][a[6]]>=0) return true;
        else {vis7[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]][a[6]]=step;return false;}
    }
}
void inite(){
    memset(vis1,-1,sizeof(vis1));
    memset(vis2,-1,sizeof(vis2));
    memset(vis3,-1,sizeof(vis3));
    memset(vis4,-1,sizeof(vis4));
    memset(vis5,-1,sizeof(vis5));
    memset(vis6,-1,sizeof(vis6));
    memset(vis7,-1,sizeof(vis7));
}
void bfs(int cc[],int num){
    node k;k.step=0;int b[7];
    for(int i=0;i<num;i++){k.a[i]=i;}
    check(a,num,0);
    queue<node> que;que.push();
    while(!que.empty()){
        node top=que.top();que.pop();
        for(int i=0;i<num;++i)
            b[i]=top.a[i];
        for(int i=0;i<num;++i){
            int l=b[i]-1;
            int r=b[i]+1;
            if(l<0) l=-1;
            if(r>=num) r=-1;
            for(int j=0;j<i;++j) if(b[j]==b[i]){l=r=-1;}
            for(int j=0;j<i;++j) if(b[j]==b[i]-1) {l=-1;}
            for(int j=0;j<i;++j) if(b[j]==b[i]+1) {r=-1;}
            if(l!=-1){
                int temp=b[i];
                b[i]=l;
                node s;
                for(int j=0;j<num;++j) {s.a[j]=a[j];}
                s.step=top.step;
                if(!check(a,num,s.step)){
                    que.push(s);
                }
                b[i]=temp;
            }
            if(r!=-1){
                int temp=b[i];
                b[i]=r;
                node s;
                for(int j=0;j<num;++j) {s.a[j]=a[j];}
                s.step=top.step;
                if(!check(a,num,s.step)){
                    que.push(s);
                }
                b[i]=temp;
            }
        }
    }
}

int main(){
    int T;
    for(scanf("%d"))
    return 0;
}

 

以上是关于北京网络赛G BOXES 状态压缩+有序BFS+高维数组判重的主要内容,如果未能解决你的问题,请参考以下文章

2018亚洲区预选赛北京赛站网络赛 A.Saving Tang Monk II BFS

hihocode 1584 : Bounce (找规律)(2017 北京网络赛G)

2016 acm香港网络赛 B题. Boxes

ZOJ 3814 Sawtooth Puzzle (2014年牡丹江赛区网络赛F题)

(每日一题)2016 北京ICPC网络赛G hihocoder 1388 (中国剩余定理 + NTT)

2016 ACM/ICPC 区域赛(北京) E 题 bfs