标签:人生 解决 img define clu 贪心 情况 signed code
Cf的数据果然毒瘤, 一百多个点, 卡了我一晚上...
写这道题的一点人生经验 :
#include<cstdio>
#define re register
#define in inline
int n,m;
char a[151][151];
int e[151][2];
in int abs(int x)
{
return x>0?x:-x;
}
in int dis(int x1,int y1,int x2,int y2)
{
return abs(x1-x2)+abs(y1-y2);
}
signed main()
{
scanf("%d%d",&n,&m);
for(re int i=1;i<=n;++i)
{
scanf("%s",a[i]+1);
for(re int j=1;j<=m;++j)
{
if(a[i][j]==‘W‘){
if(!e[i][0]) e[i][0]=j;
e[i][1]=j;
}
}
}//e[i][0]第i行最左边草的坐标, e[i][1]最右边的草
int ans=0,nx=1,ny=1;//nx, ny: 当前位置
if(e[1][0]) {ans+=dis(nx,ny,1,e[1][1]);ny=e[1][1];}
for(re int i=1;i<n;++i)
{
if(!e[i+1][0]) continue;
if(i&1){
if(e[i+1][1]>=ny){
ans+=dis(nx,ny,i+1,e[i+1][1]);//防止下一行逆行走的额外步数
nx=i+1,ny=e[i+1][1];
ans+=dis(nx,ny,i+1,e[i+1][0]);
nx=i+1,ny=e[i+1][0];
}
else{
ans+=dis(nx,ny,i+1,e[i+1][0]);
nx=i+1,ny=e[i+1][0];
}
}
else{
if(e[i+1][0]<=ny){
ans+=dis(nx,ny,i+1,e[i+1][0]);//防止下一行逆行走的额外步数
nx=i+1,ny=e[i+1][0];
ans+=dis(nx,ny,i+1,e[i+1][1]);
nx=i+1,ny=e[i+1][1];
}
else{
ans+=dis(nx,ny,i+1,e[i+1][1]);
nx=i+1,ny=e[i+1][1];
}
}
}
printf("%d\n",ans);
return 0;
}
标签:人生 解决 img define clu 贪心 情况 signed code
原文地址:https://www.cnblogs.com/cgazn/p/10331605.html