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