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,转载请注明来源
  • 相关阅读:
    Matplotlib介绍
    过拟合与欠拟合
    EM最大期望算法
    深度学习之卷积神经网络CNN及tensorflow代码实例
    朴素贝叶斯及贝叶斯网络简介
    迁移学习简介
    Tensorflow 之物体检测
    tensorflow object detection API
    ubuntu17.04中启动Tensorboard过程
    deep learning 经典网络模型之Alexnet、VGG、Googlenet、Resnet
  • 原文地址:https://www.cnblogs.com/zhber/p/4036012.html
Copyright © 2011-2022 走看看