纯模拟
用 l, r 来记录在当层走过的最左边,和最右边;
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
char map[110][10100];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
scanf("%s",map[i]);
bool flag = false;
bool flag1 = true;
long long time=0;
int deep = 0;
int l=0,r=0;
int moveto=0;
while(!flag)
{
if( !flag1 && ( r+1==m || map[deep][r+1]=='#' ) && ( l==0 || map[deep][l-1]=='#' ) )
break;
flag1 = false;
if(moveto==0)
{
time += (r-l) ;
while(1)
{
if(map[deep+1][r]=='.')
{
time++;
l = r;
flag1 = true;
if((++deep)==n-1) flag=true;
break;
}
if(r==m-1||map[deep][r+1]!='.')
{
time++;
moveto = 1;
if(r+1<m&&map[deep][r+1]=='+')
map[deep][r+1]='.';
break;
}
else
r++,time++;
}
}
else
{
time += (r-l) ;
while(1)
{
if(map[deep+1][l]=='.')
{
time++;
r = l;
flag1=true;
if((++deep)==n-1)
flag=true;
break;
}
if(l==0||map[deep][l-1]!='.')
{
time++;
moveto = 0;
if(l-1>=0&&map[deep][l-1]=='+')
map[deep][l-1]='.';
break;
}
else
l--,time++;
}
}
}
if(flag) printf("%I64d\n",time);
else printf("Never\n");
}
return 0;
}