现在的位置: 首页 > 综合 > 正文

2014.8.4我出的模拟赛【你看他走位多好啊】

2018年01月13日 ⁄ 综合 ⁄ 共 2416字 ⁄ 字号 评论关闭

你看他走位多好啊

(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\n%d\n%I64d\n",f[ex][ey].add,f[ex][ey].step,f[ex][ey].num);
}

抱歉!评论已关闭.