// 2018/07/04 Tazoe

#include <iostream>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;

class SP{
public:
	int p[8];
};

int SP2K(SP sp)
{
	int k = 0;
	for(int i=0; i<8; i++){
		k = k*8+sp.p[i];
	}

	return k;
}

int main()
{
	while(true){
		SP sp;
		cin >> sp.p[0];

		if(cin.eof())
			break;

		for(int i=1; i<8; i++){
			cin >> sp.p[i];
		}

		queue<SP> que;			// キュー
		que.push(sp);

		map<int, int> n;			// マップ（手数）
		n[SP2K(sp)] = 0;

		while(!que.empty()){		// キューが空になるまで
			sp = que.front();
			que.pop();
/*
			for(int i=0; i<8; i++){
				cout << sp.p[i] << ' ';
			}
			cout << endl;
*/
			// 最終状態
			if(sp.p[0]==0 && sp.p[1]==1 && sp.p[2]==2 && sp.p[3]==3
			&& sp.p[4]==4 && sp.p[5]==5 && sp.p[6]==6 && sp.p[7]==7){
				cout << n[SP2K(sp)] << endl;
				break;
			}

			// 0を探す
			int i0;
			for(int i=0; i<8; i++){
				if(sp.p[i]==0){
					i0 = i;
					break;
				}
			}

			// 上と交換
			if(!(0<=i0 && i0<=3)){
				SP sp2 = sp;
				swap(sp2.p[i0], sp2.p[i0-4]);
				if(n.find(SP2K(sp2))==n.end()){
					que.push(sp2);
					n[SP2K(sp2)] = n[SP2K(sp)]+1;
				}
			}

			// 下と交換
			if(!(4<=i0 && i0<=7)){
				SP sp2 = sp;
				swap(sp2.p[i0], sp2.p[i0+4]);
				if(n.find(SP2K(sp2))==n.end()){
					que.push(sp2);
					n[SP2K(sp2)] = n[SP2K(sp)]+1;
				}
			}

			// 左と交換
			if(!(i0==0 || i0==4)){
				SP sp2 = sp;
				swap(sp2.p[i0], sp2.p[i0-1]);
				if(n.find(SP2K(sp2))==n.end()){
					que.push(sp2);
					n[SP2K(sp2)] = n[SP2K(sp)]+1;
				}
			}

			// 右と交換
			if(!(i0==3 || i0==7)){
				SP sp2 = sp;
				swap(sp2.p[i0], sp2.p[i0+1]);
				if(n.find(SP2K(sp2))==n.end()){
					que.push(sp2);
					n[SP2K(sp2)] = n[SP2K(sp)]+1;
				}
			}
		}
	}

	return 0;
}

