zoukankan      html  css  js  c++  java
  • 八数码(康拓展开标记)及类似题

    文章:https://www.cnblogs.com/Mychael/p/8282895.html

    康拓展开,知道数列求排名

    //3 2 5 4 1       59
    #include<bits/stdc++.h>
    using namespace std;
    int fac[20],sign[20],a[20],label[20],n;
    void init(){
        fac[0]=1;
        for(int i=1;i<=10;i++)
            fac[i]=fac[i-1]*i;
    }
    int kangtuo(int* a){
        for(int i=0;i<n;i++)
            sign[i]=1;
        int paiming=0;
        for(int i=0;i<n;i++){
            int cnt=0;
            for(int j=0;j<a[i];j++)
                if(sign[j])
                    cnt++;
            sign[a[i]]=0;
            paiming+=cnt*fac[n-i-1];
        }
        return paiming;
    }
    int main(){
        init();
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i],a[i]--;///第一位的排名是0,所以要自减
        cout<<kangtuo(a)<<endl;
        return 0;
    }

    康拓逆展开,知排名求数列

    //10  5      1 3 4 5 2
    #include<bits/stdc++.h>
    using namespace std;
    int ans[20],fac[20],sign[20],a[20],label[20],n;
    void init(){
        fac[0]=1;
        for(int i=1;i<=10;i++)
            fac[i]=fac[i-1]*i;
    }
    void nikangtuo(int paiming,int m){
        paiming--;
        int cnt;
        for(int i=0;i<m;i++)
            label[i]=1;
        for(int i=0;i<m;i++){
            cnt=paiming/fac[m-1-i];
            paiming=paiming%fac[m-1-i];
            for(int j=0;j<m;j++){
                if(!label[j])
                    continue;
                if(!cnt){
                    label[j]=0;
                    ans[i]=j;
                    break;
                }
                cnt--;
            }
        }
        for(int i=0;i<m;i++)
            cout<<ans[i]+1<<" ";
    }
    int main()
    {
        init();
    
        int paiming,m;
        cin>>paiming>>m;
        nikangtuo(paiming,m);
    }
    

      

    http://poj.org/problem?id=1077

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    const int M=4e5+5;
    struct node{
        int a[9];
    }que[M],endd;
    int factorial[9],start[9];
    char str[2],dir[]="lrdu",op[M];
    int net[M],vis[M];
    int nextx[4]={0,0,-1,1};
    int nexty[4]={1,-1,0,0};
    void init(){
        factorial[0]=1;
        for(int i=1;i<9;i++)
            factorial[i]=factorial[i-1]*i;
    }
    int kang(int *a){
        int v=0;
        for(int i=0;i<9;i++){
            int countt=0;
            for(int j=i+1;j<9;j++)
                if(a[i]>a[j])
                    countt++;
            v+=countt*factorial[8-i];
        }
        return v;
    }
    void bfs(int sign){
        int head=0,tail=0;
        que[tail++]=endd;
        vis[sign]=1;
        while(head<tail){
            node P=que[head++];
            int now_sign=kang(P.a);
            int x,y,z;
            for(int i=0;i<9;i++){
                if(P.a[i]==0){
                    x=i/3,y=i%3,z=i;
                    break;
                }
            }
            node Q=P;
            for(int i=0;i<4;i++){
                int tx=x+nextx[i];
                int ty=y+nexty[i];
                if(tx<0||ty<0||tx>=3||ty>=3)
                    continue;
                int tz=tx*3+ty;
                Q.a[z]=P.a[tz];
                Q.a[tz]=0;
                int Q_sign=kang(Q.a);
                if(!vis[Q_sign]){
                    vis[Q_sign]=1;
                    op[Q_sign]=dir[i];
                    net[Q_sign]=now_sign;
                    que[tail++]=Q;
                }
                Q=P;
            }
        }
    }
    int main(){
        init();
        for(int i=0;i<9;i++)
            if(i==8)
                endd.a[i]=0;
            else
                endd.a[i]=i+1;
        int sign=kang(endd.a);
        bfs(sign);
        while(~scanf("%s",str)){
            if(str[0]=='x')
                start[0]=0;
            else
                start[0]=str[0]^48;
            for(int i=1;i<9;i++){
                scanf("%s",str);
                if(str[0]=='x')
                    start[i]=0;
                else
                    start[i]=str[0]^48;
            }
            int start_sign=kang(start);
            if(vis[start_sign]){
                while(sign!=start_sign){
                    putchar(op[start_sign]);
                    start_sign=net[start_sign];    
                }putchar('
    ');
            }
            else
                puts("unsolvable");
        }
        return 0;
    }
    View Code

    https://www.luogu.org/problemnew/show/P2730

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int mi(int x,int y){
        return x<y?x:y;
    }
    inline int read(){
        int sum=0,x=1;
        char ch=getchar();
        while(ch<'0'||ch>'9'){
            if(ch=='-')
                x=0;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9'){
            sum=(sum<<1)+(sum<<3)+(ch^48),ch=getchar();
        }
        return x?sum:-sum;
    }
    inline void write(int x){
        if(x<0)
            putchar('-'),x=-x;
        if(x>9)
            write(x/10);
        putchar(x%10+'0');
    }
    const int M=4e5+5;
    struct node{
        int a[8];
    }que[M],endd;
    int fac[8],start[8];
    char dir[]="ABC",op[M],anss[M];
    int nextt[M],vis[M];
    void init(){
        fac[0]=1;
        for(int i=1;i<8;i++)
            fac[i]=fac[i-1]*i;
    }
    int kang(int *a){
        int ans=0;
        for(int i=0;i<8;i++){
            int countt=0;
            for(int j=i+1;j<8;j++)
                if(a[i]>a[j])
                    countt++;
            ans+=countt*fac[7-i];
        }
        return ans;
    }
    void bfs(int sign){
        int head=0,tail=0;
        que[tail++]=endd;
        vis[sign]=1;
        while(head<tail){
            node P=que[head++];
            int now_sign=kang(P.a);
            node Q=P;
            for(int i=0;i<3;i++){
                //A
                if(i==0){
                    for(int j=0;j<=3;j++){
                        int t=Q.a[j];
                        Q.a[j]=Q.a[7-j];
                        Q.a[7-j]=t;
                    }
                }
                //B
                else if(i==1){
                    Q.a[0]=P.a[3];
                    Q.a[1]=P.a[0];
                    Q.a[2]=P.a[1];
                    Q.a[3]=P.a[2];
                    Q.a[4]=P.a[5];
                    Q.a[5]=P.a[6];
                    Q.a[6]=P.a[7];
                    Q.a[7]=P.a[4];
                }
                //C
                else{
                    Q.a[0]=P.a[0];
                    Q.a[1]=P.a[6];
                    Q.a[2]=P.a[1];
                    Q.a[3]=P.a[3];
                    Q.a[4]=P.a[4];
                    Q.a[5]=P.a[2];
                    Q.a[6]=P.a[5];
                    Q.a[7]=P.a[7];
                }
                int Q_sign=kang(Q.a);
                if(!vis[Q_sign]){
                    vis[Q_sign]=1;
                    op[Q_sign]=dir[i];
                    nextt[Q_sign]=now_sign;
                    que[tail++]=Q;
                }
                Q=P;
            }
        }
    }
    int main(){
        init();
        for(int i=0;i<8;i++)
            endd.a[i]=i+1;
        int sign=kang(endd.a);
        bfs(sign);
        while(~scanf("%d",&start[0])){
            for(int i=1;i<8;i++)
                start[i]=read();
            int start_sign=kang(start);
        //    string ss;
            int i=0;
            while(sign!=start_sign){
                //putchar(op[start_sign]);
                //ss+=op[start_sign];
                anss[i++]=op[start_sign];
                start_sign=nextt[start_sign];
            }
            write(i);
            putchar('
    ');
            i--;
            for(;i>=0;i--)
                putchar(anss[i]);
            putchar('
    ');
        }
        return 0;
    }
    View Code
  • 相关阅读:
    位运算学习
    C语言从文件中读取数字
    百度网盘视频加速代码
    算法思想
    递归解决全排列问题
    android studio出现offline情况
    二叉树的遍历(递归与非递归)
    (一)为什么要UML
    Logstash详解之——input模块
    解决maven项目update project会更改jdk版本问题
  • 原文地址:https://www.cnblogs.com/starve/p/10970413.html
Copyright © 2011-2022 走看看