zoukankan      html  css  js  c++  java
  • vijos 1110小胖邮递员;bzoj 1210: [HNOI2004]邮递员

    Description

    Smith在P市的邮政局工作,他每天的工作是从邮局出发,到自己所管辖的所有邮筒取信件,然后带回邮局。他所管辖的邮筒非常巧地排成了一个m*n的点阵(点阵中的间距都是相等的)。左上角的邮筒恰好在邮局的门口。 Smith是一个非常标新立异的人,他希望每天都能走不同的路线,但是同时,他又不希望路线的长度增加,他想知道他有多少条不同的路线可走。【任务描述】你的程序需要根据给定的输入,给出符合题意的输出: 输入包括点阵的m和n的值; 你需要根据给出的输入,计算出Smith可选的不同路线的总条数;

    Input

    只有一行。包括两个整数m, n(1 <= m <= 10, 1 <= n <= 20),表示了Smith管辖内的邮筒排成的点阵。

    Output

    只有一行,只有一个整数,表示Smith可选的不同路线的条数。

    Sample Input

    2 2
    说明:该输入表示,Smith管辖了2*2的一个邮筒点阵。

    Sample Output

    2
     
    裸插头dp
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int bi=1000000000;
    int i;
    struct na{
        int x,z;
        na(int xx,int zz):x(xx),z(zz){}
    };
    struct big{
        int a[100];
        big(){
            memset(a,0,sizeof(a));
            a[0]=1;
        }
        big operator =(int x){
            if (x==0){
                memset(a,0,sizeof(a));
                a[0]=1;
                return *this;
            }
            a[0]=0;
            while (x){
                a[0]++;
                a[a[0]]=x%bi;
                x/=bi;
            }
            if (!a[0]) a[0]=1;
            return *this;
        }
        big operator +(const big &x){
            big r;
            if (a[0]<x.a[0]) r.a[0]=x.a[0];else r.a[0]=a[0];
            for (i=1;i<=r.a[0];i++) r.a[i]=a[i]+x.a[i];
            for (i=1;i<=r.a[0];i++)
            if (r.a[i]>=bi){
                r.a[i]-=bi;r.a[i+1]++;
                if (i==r.a[0]) r.a[0]++;
            }
            return r;
        }
    }ans;
    int n,m,x,y,z,a[21],k,p1,p2;
    bool map[21][21];
    big f[2][177148];
    int v[2][177148];
    queue <na> q;
    inline int gx(int x,int q1,int q2){k=0;for (register int i=m+1;i;i--) k=k*3+(i==x?q1:(i==x+1?q2:a[i]));return k;}
    inline void up(int x,int z,big lj){
        x++;
        k=x%2;
        if (v[k][z]!=x) v[k][z]=x,f[k][z]=0,q.push(na(x,z));
        f[k][z]=f[k][z]+lj;
    }
    int main(){
        register int i,j;
        scanf("%d%d",&n,&m);
        if (n<m) swap(n,m);
        for (i=1;i<=m;i++)
        for (j=1;j<=n;j++)
        map[i][j]=1;
        f[0][0]=v[0][0]=1;
        q.push(na(0,0));
        while(!q.empty()){
            na no=q.front();q.pop();
            big an=f[no.x%2][no.z];
            if(no.x%m==0) no.z*=3;
            x=no.x%m+1;y=no.x/m+1;
            for (i=1;i<=m+1;i++) a[i]=0;
            for (i=1,j=no.z;j;i++,j/=3) a[i]=j%3;
            if (!map[x][y]) up(no.x,gx(x,0,0),an);else
            if (a[x]==1&&a[x+1]==2){
                if (x==m&&y==n) ans=ans+an;
            }else if (a[x]==2&&a[x+1]==1) up(no.x,gx(x,0,0),an);else
            if (a[x]==0&&a[x+1]==0){
                if (map[x][y+1]&&map[x+1][y]) up(no.x,gx(x,1,2),an);
            }else if (a[x]==0){
                if (map[x+1][y]) up(no.x,gx(x,0,a[x+1]),an);
                if (map[x][y+1]) up(no.x,gx(x,a[x+1],0),an);
            }else if (a[x+1]==0){
                if (map[x+1][y]) up(no.x,gx(x,0,a[x]),an);
                if (map[x][y+1]) up(no.x,gx(x,a[x],0),an);
            }else if (a[x]==a[x+1]){
                p1=p2=0;
                if (a[x]==1)
                for (j=0,i=x+2;i<=m;i++){
                    if (a[i]==1) j--;
                    if (a[i]==2) j++;
                    if (j>0&&!p1) p1=i,j--;
                    if (j>0&&p1){p2=i;break;}
                }else
                for (j=0,i=x-1;i;i--){
                    if (a[i]==1) j++;
                    if (a[i]==2) j--;
                    if (j>0&&!p2) p2=i,j--;
                    if (j>0&&p2){p1=i;break;}
                }
                a[p1]=1;a[p2]=2;up(no.x,gx(x,0,0),an);
            }
        }
        ans=ans+ans;
        if (ans.a[0]==1&&ans.a[1]==0) printf("1
    ");else{
            printf("%d",ans.a[ans.a[0]]);
            for (i=ans.a[0]-1;i;i--) printf("%09d",ans.a[i]);
        }
    }
     
  • 相关阅读:
    物联网操作系统HelloX V1.77(beta)版本发布
    对XX证券报关于物联网操作系统的几个问题的答复
    Android利用广播实现ViewPager中item之间的数据通信
    Android创建桌面快捷方式
    Android时间选择器对话框的使用
    Android数据库LitePal的存储操作
    Android创建数据表和LitePal的基本用法
    我的2014
    logstash 安装zabbix插件
    tag_on_failure => [] # prevent default _grokparsefailure tag on real records
  • 原文地址:https://www.cnblogs.com/Enceladus/p/5137154.html
Copyright © 2011-2022 走看看