zoukankan      html  css  js  c++  java
  • 2015北京网络赛 G题 Boxes bfs

    Boxes

    Time Limit: 1 Sec  

    Memory Limit: 256 MB

    题目连接

    http://hihocoder.com/contest/acmicpc2015beijingonline/problem/7

    Description

    There is a strange storehouse in PKU. In this storehouse there are n slots for boxes, forming a line. In each slot you can pile up any amount of boxes. The limitation is that you can only pile a smaller one above a bigger one, in order to keep balance. The slots are numbered from 1 to n. The leftmost one is slot 1.

    At first there is exactly one box in each slot. The volume of the box in slot i is vi. As a virgo, you decide to sort these boxes by moving some of them. In each move you can choose a slot and move the top box in this slot to an adjacent slot (of course you can only put it on the top). You should ensure that the limitation mentioned above is still satisfied after this move. After the sort operation, there should be exactly one box in each slot, and for each pair of adjacent slots, the box in the left one should be smaller than the box in the right one.

    Your task is to calculate the minimum number of moves you need to sort the boxes.

    Input

    In the first line there’s an integer T(T≤6000), indicating the number of test cases. The following 2T lines describe the test cases.

    In each test case, the first line contains an integer n, indicating the number of slots. The second line contains n integers v1,v2…vn, indicating the volume of the boxes. It is guaranteed that all vi in a test case are different.

    Please note that n<8,0≤vi≤104

    Output

    For each test case, print a line containing one integer indicating the answer. If there are infinity common points, print -1.

    Sample Input

    4
    3
    2 1 3
    2
    7 8
    2
    10000 1000
    3
    97 96 95

    Sample Output

    4
    0
    -1
    20

    HINT

    题意

    给你一堆盒子,每个盒子只能仍在旁边比他大的上面,你每次只能操作当前位置最小的一个

    然后问你最少多少次,可以使得盒子摆放有序

    题解:

    bfs爆搜……

    恶心题,太麻烦了= =

    代码:

    //qscqesze
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <vector>
    #include <sstream>
    #include <queue>
    #include <typeinfo>
    #include <fstream>
    #include <map>
    #include <stack>
    typedef long long ll;
    using namespace std;
    //freopen("D.in","r",stdin);
    //freopen("D.out","w",stdout);
    #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
    #define maxn 2000000 + 500
    #define mod 10007
    #define eps 1e-9
    int Num;
    char CH[20];
    //const int inf=0x7fffffff;   //нчоч╢С
    const int inf=0x3f3f3f3f;
    //**************************************************************************************
    
    int dp7[7][7][7][7][7][7][7];
    int vis7[7][7][7][7][7][7][7];
    int dp6[7][7][7][7][7][7];
    int vis6[7][7][7][7][7][7];
    int dp5[7][7][7][7][7];
    int vis5[7][7][7][7][7];
    int dp4[7][7][7][7];
    int vis4[7][7][7][7];
    int dp3[7][7][7];
    int vis3[7][7][7];
    int dp2[7][7];
    int vis2[7][7];
    int dp1[7];
    int vis1[7];
    map<int,int> H;
    int a[10];
    int b[10];
    int vvv[10];
    struct node
    {
        int a[7];
        int step;
    };
    int check(int a[],int num,int step)
    {
        if(num==7)
        {
            if(vis7[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]][a[6]])
                return 0;
            dp7[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]][a[6]]=step;
            vis7[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]][a[6]] = 1;
            return 1;
        }
        if(num==6)
        {
             if(vis6[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]])
                return 0;
            dp6[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]]=step;
            vis6[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]]= 1;
            return 1;
        }
        if(num==5)
        {
             if(vis5[a[0]][a[1]][a[2]][a[3]][a[4]])
                return 0;
            dp5[a[0]][a[1]][a[2]][a[3]][a[4]]=step;
            vis5[a[0]][a[1]][a[2]][a[3]][a[4]]= 1;
            return 1;
        }
        if(num==4)
        {
             if(vis4[a[0]][a[1]][a[2]][a[3]])
                return 0;
            dp4[a[0]][a[1]][a[2]][a[3]]=step;
            vis4[a[0]][a[1]][a[2]][a[3]]= 1;
            return 1;
        }
        if(num==3)
        {
             if(vis3[a[0]][a[1]][a[2]])
                return 0;
            dp3[a[0]][a[1]][a[2]]=step;
            vis3[a[0]][a[1]][a[2]]= 1;
            return 1;
        }
        if(num==2)
        {
             if(vis2[a[0]][a[1]])
                return 0;
            dp2[a[0]][a[1]]=step;
            vis2[a[0]][a[1]]= 1;
            return 1;
        }
        if(num==1)
        {
             if(vis1[a[0]])
                return 0;
            dp1[a[0]]=step;
            vis1[a[0]]= 1;
            return 1;
        }
        return 0;
    }
    void solve(int ccc[],int step,int num)
    {
        node p;
        for(int i=0;i<num;i++)
            p.a[i]=ccc[i];
        int a[10];
        check(ccc,num,0);
        queue<node> Q;
        p.step = 0;
        Q.push(p);
        while(!Q.empty())
        {
            node k = Q.front();
            Q.pop();
            for(int i=0;i<num;i++)
                a[i]=k.a[i];
            for(int i=0;i<num;i++)
            {
                int temp = a[i];
                int l = a[i]-1,r = a[i]+1;
                if(l<0)l=-1;
                if(r>=num)r=-1;
                for(int j=0;j<i;j++)
                {
                    if(a[j]==a[i])
                    {
                        l = -1;
                        r = -1;
                    }
                }
                for(int j=0;j<i;j++)
                    if(a[j]==a[i]-1)
                        l = -1;
                for(int j=0;j<i;j++)
                    if(a[j]==a[i]+1)
                        r = -1;
                if(l!=-1)
                {
                    a[i]=l;
                    for(int i=0;i<num;i++)
                        p.a[i]=a[i];
                    p.step = k.step + 1;
                    if(check(a,num,p.step))
                        Q.push(p);
                    a[i]=temp;
                }
                if(r!=-1)
                {
                    a[i]=r;
                    for(int i=0;i<num;i++)
                        p.a[i]=a[i];
                    p.step = k.step + 1;
                    if(check(a,num,p.step))
                        Q.push(p);
                    a[i]=temp;
                }
            }
        }
    }
    
    
    int main()
    {
        int t;scanf("%d",&t);
        int c[7];
        memset(dp7,-1,sizeof(dp7));
        memset(dp6,-1,sizeof(dp6));
        memset(dp5,-1,sizeof(dp5));
        memset(dp4,-1,sizeof(dp4));
        memset(dp3,-1,sizeof(dp3));
        memset(dp2,-1,sizeof(dp2));
        memset(dp1,-1,sizeof(dp1));
        for(int i=0;i<7;i++)
            c[i]=i;
        for(int i=0;i<7;i++)
            solve(c,0,i+1);
        while(t--)
        {
            H.clear();
            vector<int> Q;
            int n;scanf("%d",&n);
            for(int i=0;i<n;i++)
            {scanf("%d",&a[i]);Q.push_back(a[i]);}
            sort(Q.begin(),Q.end());
            for(int i=0;i<Q.size();i++)
                H[Q[i]]=i;
            for(int i=0;i<n;i++)
                b[H[a[i]]]=i;
            if(n==1)
            {
                if(b[0]==0)
                    printf("0
    ");
                else
                    printf("%d
    ",dp1[b[0]]);
            }
            if(n==2)
            {
                if(b[0]==0&&b[1]==1)
                    printf("0
    ");
                else
                    printf("%d
    ",dp2[b[0]][b[1]]);
            }
            if(n==3)
            {
                if(b[0]==0&&b[1]==1&&b[2]==2)
                    printf("0
    ");
                else
                printf("%d
    ",dp3[b[0]][b[1]][b[2]]);
            }
            if(n==4)
            {
                if(b[0]==0&&b[1]==1&&b[2]==2&&b[3]==3)
                    printf("0
    ");
                else
                printf("%d
    ",dp4[b[0]][b[1]][b[2]][b[3]]);
            }
            if(n==5)
            {
                if(b[0]==0&&b[1]==1&&b[2]==2&&b[3]==3&&b[4]==4)
                    printf("0
    ");
                else
                printf("%d
    ",dp5[b[0]][b[1]][b[2]][b[3]][b[4]]);
            }
            if(n==6)
            {
                if(b[0]==0&&b[1]==1&&b[2]==2&&b[3]==3&&b[4]==4&&b[5]==5)
                    printf("0
    ");
                else
                    printf("%d
    ",dp6[b[0]][b[1]][b[2]][b[3]][b[4]][b[5]]);
            }
            if(n==7)
            {
                if(b[0]==0&&b[1]==1&&b[2]==2&&b[3]==3&&b[4]==4&&b[5]==5&&b[6]==6)
                    printf("0
    ");
                else
                printf("%d
    ",dp7[b[0]][b[1]][b[2]][b[3]][b[4]][b[5]][b[6]]);
            }
    
        }
    }
  • 相关阅读:
    #include <utility>
    Html的空格显示
    ExtJs自学教程(1):一切从API開始
    天黑的时候,我又想起那首歌
    citrix协议ICA技术原理
    约瑟夫环问题
    数据结构和算法设计专题之---八大内部排序
    HDU
    深入分析C++引用
    八大排序算法总结
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4824234.html
Copyright © 2011-2022 走看看