• POJ 1739:Tony's Tour


    Description

    A square township has been divided up into n*m(n rows and m columns) square plots (1<=N,M<=8),some of them are blocked, others are unblocked. The Farm is located in the lower left plot and the Market is located in the lower right plot. Tony takes her tour of the township going from Farm to Market by walking through every unblocked plot exactly once. 
    Write a program that will count how many unique tours Betsy can take in going from Farm to Market. 

    Input

    The input contains several test cases. The first line of each test case contain two integer numbers n,m, denoting the number of rows and columns of the farm. The following n lines each contains m characters, describe the farm. A '#' means a blocked square, a '.' means a unblocked square. 
    The last test case is followed by two zeros. 

    Output

    For each test case output the answer on a single line.

    Sample Input

    2 2
    ..
    ..
    2 3
    #..
    ...
    3 4
    ....
    ....
    ....
    0 0
    

    Sample Output

    1
    1
    4


    楼教主八题之一,同样可以加行,也可以特殊处理,我写的是加行。
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int mn=177147;
    int i;
    struct na{
        int x,z;
        na(int xx,int zz):x(xx),z(zz){}
    };
    int n,m,x,y,z,a[21],k,en,p1,p2;
    char u[100];
    bool map[21][21];
    long long f[2][mn+1],ans;
    int v[2][mn+1];
    int re[21][21];
    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,long long 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]+=lj;
    }
    int main(){
        register int i,j;
        while(scanf("%d%d",&n,&m)!=EOF){
            if (n==0&&m==0) break;
            ans=0;
            memset(map,0,sizeof(map));memset(v,0,sizeof(v));memset(re,0,sizeof(re));memset(f,0,sizeof(f));
            for (i=1;i<=n;i++){
                scanf("%s",&u);
                for (j=1;j<=m;j++)
                map[j][n-i+3]=u[j-1]=='.';
            }
            n+=2;
            en=n*m-1;
            map[1][2]=1;map[m][2]=1;
            for (i=1;i<=m;i++) map[i][1]=1;
            while(!map[en%m+1][en/m+1]) en--;
            f[0][0]=v[0][0]=1;
            q.push(na(0,0));
            while(!q.empty()){
                na no=q.front();q.pop();
                long long 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 (no.x==en) 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);
                }
            }
            printf("%I64d
    ",ans);
        }
    }
    
    
  • 相关阅读:
    仓位管理 – 1.理论篇
    作为首席架构师,我是如何选择并落地架构方案的?
    asp.net MVC 应用程序的生命周期
    微服务架构优缺点
    一位同事对 Rafy 框架的一些建议及我的回复
    .NET 版本区别,以及与 Windows 的关系
    MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)
    何时使用静态 API
    2011奥斯卡最佳纪录片《监守自盗(Inside Job)》小结
    Rafy 框架
  • 原文地址:https://www.cnblogs.com/Enceladus/p/5137183.html
Copyright © 2020-2023  润新知