#include<bits/stdc++.h>
#define f first
#define s second
#define mp make_pair
using namespace std;

typedef pair<int,pair<int,int> > pii;

int Y[4]={-1,0,1,0};
int X[4]={0,1,0,-1};
string g="5555555555555555";

bool in(int a,int b){
  if(a<0 || b<0 || 4<=a || 4<=b)return false;
  return true;
}

string bfs(string s,int index){
  s[index]++;
  if(s[index]!='5')return s;

  int d[16]={};
  queue<pii> q;
  for(int i=0;i<4;i++)q.push(mp(0,mp(index,i)));

  while(!q.empty()){
    pii u=q.front();
    q.pop();

    int ny=u.s.f/4+Y[u.s.s],nx=u.s.f%4+X[u.s.s];
    if(!in(ny,nx))continue;
    int nindex=ny*4+nx;
    if(d[nindex]==u.f+1 && s[nindex]=='5')continue;
    if(s[nindex]=='5')q.push(mp(u.f+1,mp(nindex,u.s.s)));
    else {
      s[nindex]++;
      d[nindex]=u.f+1;
      if(s[nindex]=='5'){
	for(int i=0;i<4;i++)q.push(mp(u.f+1,mp(nindex,i)));
      }
    }
  }
  return s;
}

int main()
{

  int a;
  string s;

  for(int i=0;i<16;i++){
    cin>>a;
    if(a==0)s+='5';
    else s+=(a+'0');
  }

  map<string,int> m;
  queue<string> q;
  int ans=-1;
  q.push(s);
  m[s]=0;

  while(q.size()){
    string u=q.front();
    q.pop();
    int cost=m[u];

    if(5<cost)break;

    if(u==g){
      ans=cost;
      break;
    }

    for(int i=0;i<16;i++){
      string t=u;
      if(t[i]=='5')continue;
      t=bfs(t,i);

      if(m.find(t)==m.end()){
	m[t]=cost+1;
	q.push(t);
      }
    }
  }

  cout<<ans<<endl;

  return 0;
}