zoukankan      html  css  js  c++  java
  • 2014.8.4我出的模拟赛【你看他走位多好啊】

    你看他走位多好啊

    (zouwei.pas/.c/.cpp)

    在七夕过后不久,Czy把hzwer的后宫们抢走不少……hzw怒了,要冲到czy的的后宫里找他算账。

    但是czy的后宫是风水宝地,三面环山一面环水,按太极五行八卦二十八宿之势,隐隐有王八之气侧漏。依山傍水易守难攻,前有“良将劲弩守要害之处”,后有“信臣精卒陈利兵而谁何”。总之黄巨大只能从水路上去就对了。

        那是一片n*m的水域……只要从(x1,y2)走到位置(x2,y2)的传送阵中就好啦……但是黄巨大不(tai)够(shen)强(xu),没法在水上如履平地……幸好水上有若干个岩石是可以站在上面的,而且可以站无限多次。但是同样的有若干个点有漩涡、激流或者奇怪的生物(比如zzz)出没……总之这些点不能走。黄巨大昨晚把妹过多,所以他摇摇晃晃的只能一步走长度为的路径,并且只能站在整点上。当然黄巨大比我强多了,所以他还有一个特殊的技能——可以在水上跳,跳来跳去的在跳(太跳了),但是每次走到水上跳起来都会消耗1mp和若干rp,所以他要尽快的通过这块水域,以便留足mp和rp去痛扁czy……但是他有点虚,请你告诉他最少要消耗多少mp才能通过这块水域,还有最少他要走几步,以及在步数最少限制下有多少种方案。

    输入:

    第一行两个数n,m

    接下来n行,每行m个数,表示整个水域的地图

    1:这是水

    2:这是石头

    3:危险!zzz出没!

    4:黄巨大从这里出发

    5:传送阵在这里

    输出:

    一行或三行

    如果无论如何黄巨大都到不了传送阵,输出一行-1

    否则输出三行:

    第一行:最小mp值

    第二行:最少走几步

    第三行:在步数限制下,有多少种方案

    (良心啊!我原来还想加不在步数限制下有多少方案)

    样例输入1:

    4 8

    1 1 12 1 1 1 1

    1 1 11 1 3 1 2

    1 1 11 1 5 1 1

    4 1 11 1 1 2 1

     

    样例输出1:

    2

    6

    2

    样例输入2:

    2 3

    4 1 1

    1 1 5

    样例输出2:

    0

    1

    1

    样例输入3:

    2 3

    1 4 1

    1 1 5

    样例输出3:

    -1

    数据范围:

    对于10%数据,n,m<=10,不存在zzz

    对于20%数据,n,m<=20,不存在zzz

    对于40%数据,n,m<=20

    对于60%数据,n,m<=30

    对于80%数据,n,m<=100

    对于98%数据,n,m<=200

    对于100%数据,n,m<=300

    (提示:如果代码相似度和std达到80%以上算-18446744073709551616分)


    这题完全跟bzoj1632一样的……就是数据规模10倍……还是比较轻松的

    点这里看解题报告

    #include<cstdio>
    #include<cstring>
    #define inf 10000000
    const int mx[8]={-2,-1,1,2,2,1,-1,-2};
    const int my[8]={1,2,2,1,-1,-2,-2,-1};
    struct work{
        int add,step;
        long long num;
    }f[310][310];
    int n,m,sx,sy,ex,ey;
    int map[310][310];
    int qx[3000001];
    int qy[3000001];
    bool mrk[310][310];
    inline void bfs()
    {
        int t=0,w=1;
        qx[1]=sx;qy[1]=sy;
        mrk[sx][sy]=1;
        while (t!=w)
        {
            int nx=qx[++t],ny=qy[t];
            for (int k=0;k<8;k++)
              {
                int wx=nx+mx[k],wy=ny+my[k];
                if (wx<1||wy<1||wx>n||wy>m||map[wx][wy]==3) continue;
                int t=(map[wx][wy]==1);
                if (f[nx][ny].add+t<f[wx][wy].add)
                {
                    f[wx][wy].add=f[nx][ny].add+t;
                    f[wx][wy].step=f[nx][ny].step+1;
                    f[wx][wy].num=f[nx][ny].num;
                    if (!mrk[wx][wy])
                    {
                        qx[++w]=wx;
                        qy[w]=wy;
                        mrk[wx][wy]=1;
                    }
                    continue;
                }
                if (f[nx][ny].add+t==f[wx][wy].add)
                {
                    if (f[nx][ny].step+1<f[wx][wy].step)
                    {
                        f[wx][wy].step=f[nx][ny].step+1;
                        f[wx][wx].num=f[nx][ny].num;
                        if (!mrk[wx][wy])
                        {
                            qx[++w]=wx;
                            qy[w]=wy;
                            mrk[wx][wy]=1;
                        }
                        continue;
                    }
                    if (f[nx][ny].step+1==f[wx][wy].step)
                    {
                        f[wx][wy].num+=f[nx][ny].num;
                        if (!mrk[wx][wy])
                        {
                            qx[++w]=wx;
                            qy[w]=wy;
                            mrk[wx][wy]=1;
                        }
                        continue;
                    }
                }
              }
            mrk[nx][ny]=0;
        }
    }
    int main()
    {
    	freopen("zouwei.in","r",stdin);
    	freopen("zouwei.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
          for (int j=1;j<=m;j++)
            {
              scanf("%d",&map[i][j]);
              f[i][j].add=inf;
              f[i][j].step=inf;
              if (map[i][j]==4)
              {
                sx=i;
                sy=j;
                f[i][j].add=0;
                f[i][j].step=0;
                f[i][j].num=1;
              }
              if (map[i][j]==5)
              {
                ex=i;
                ey=j;
              }
            }
        bfs();
        if (f[ex][ey].add>1e5){printf("-1");return 0;}
        printf("%d
    %d
    %I64d
    ",f[ex][ey].add,f[ex][ey].step,f[ex][ey].num);
    }
    

      

    ——by zhber,转载请注明来源
  • 相关阅读:
    openldap
    Java实现 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…
    Java实现 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P2141 珠心算测验
    Java实现 洛谷 P1567 统计天数
    Java实现 洛谷 P1567 统计天数
  • 原文地址:https://www.cnblogs.com/zhber/p/4036012.html
Copyright © 2011-2022 走看看