//题目链接:http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=62&page=show_problem&problem=32
#include<iostream>
#include<cstdio>
#include<math.h>
#define min(a,b) (a>b? b:a)
#define INF 1000000000
using namespace std;
int d[5][5][50000];
int a[100000];
int step;
//求不同策略所消耗的体力
int num(int a,int b)//a表示之前脚所在的数字,b表示要踩的数字
{
if(a==b)return 1;
else if(a==0||b==0)return 2;
else if(a-b==1||a-b==-1||a-b==3||a-b==-3)return 3;
else if(a-b==2||a-b==-2)return 4;
}
int dp(int l,int r,int k)
{
if(step<k)return 0;
if(d[l][r][k]!=INF)return d[l][r][k];
else
return d[l][r][k]=min(dp(l,a[k],k+1)+num(r,a[k]),
dp(a[k],r,k+1)+num(l,a[k]));
}
int main()
{
while(scanf("%d",&a[0]),a[0])
{
step=0;
while(scanf("%d",&a[++step]),a[step]){}
--step;
// memset(d,INF,sizeof(d));
int i,j,k;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
for(k=0;k<=step+1;k++)
d[i][j][k]=INF;
printf("%d\n",dp(0,0,0));
}
return 0;
}