你看他走位多好啊
(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); }