/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int goal=1234567;
const int pow10[10]={1,int(1e1),int(1e2),int(1e3),int(1e4),int(1e5),int(1e6),int(1e7),int(1e8),int(1e9)};
const int fac[15]={1,1,2,6,24,120,720,5040,40320,362880,3628800};
const int dir[4]={-1,1,-4,4};
const int MOD=int(1e6+7);
inline void Swap(int &num,int A,int B){
	int f=num%pow10[A+1]/pow10[A],
		g=num%pow10[B+1]/pow10[B];
	num-=f*pow10[A]+g*pow10[B];
	num+=f*pow10[B]+g*pow10[A];
}
struct QUEUE{
	int maz,pos,dep;
	QUEUE(){}
	QUEUE(int _maz,int _pos,int _dep){maz=_maz;pos=_pos;dep=_dep;}
};
bool vis[362880];
bool Search(int num)
{
	int Sum=0;
	for(int i=0;i<8;i++)
		for(int j=i+1;j<8;j++) 
			if(num%pow10[j+1]/pow10[j]<num%pow10[i+1]/pow10[i]) 
				Sum+=fac[8-i];
	if(vis[Sum]) return true;
	vis[Sum]=true;
	return false;
}
int BFS(QUEUE beg){
	if(beg.maz==goal) return 0;
	queue<QUEUE> que;
	que.push(beg);
	while(!que.empty())
	{
		QUEUE pre=que.front();que.pop();
		for(int i=0;i<4;i++)
		{
			int now=pre.maz,pos=pre.pos+dir[i],dep=pre.dep+1;
			if((i<2 && pre.pos/4!=pos/4) || pos<0 || pos>=8) continue;
			Swap(now,7-pos,7-pre.pos);
			if(Search(now)) continue;
			if(now==goal) return dep;
			que.push(QUEUE(now,pos,dep));
		}
	}
	return -1;
}
int main(){
	int beg,pos;
	while(~scanf("%d",&beg))
	{
		pos=0;
		for(int i=1,num;i<=7;i++)
			scanf("%d",&num),
			beg=beg*10+num,
			pos=!num? i:pos;
		memset(vis,0,sizeof vis);
		int res=BFS(QUEUE(beg,pos,0));
		printf("%d\n",res);
	}
	return 0;
}
/*
1 2 0 3
4 5 6 7
*/
