#include #include #include #define foreach(T,p,c) for(T p = c.begin(); p != c.end(); ++p) using namespace std; int main(void) { set A, B; bool ok[16][365], map[4][4]; ifstream cin("weather.txt"); int n; while(cin >> n) { if(n == 0) break; for(int day = 0; day < n; day++) { for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) { int m; cin >> m; map[i][j] = (m != 0); } } for(int i = 0; i < 16; i++) ok[i][day] = false; for(int i = 0; i <= 2; i++) for(int j = 0; j <= 2; j++) if(!map[i][j] && !map[i][j+1] && !map[i+1][j] && !map[i+1][j+1]) ok[i+j*4][day] = true; } A.clear(); A.insert(0x50000); for(int day = 0; day < n; day++) { B.clear(); foreach(set::iterator, p, A) { int xy = *p >> 16, m = *p & 0xFFFF; int x = xy & 3, y = xy >> 2; if(!ok[xy][day]) continue; m += 0x1111; if(xy == 0) m &= 0x0FFF; if(xy == 2) m &= 0xF0FF; if(xy == 8) m &= 0xFF0F; if(xy == 10) m &= 0xFFF0; if((m & 0xF000) >= 0x7000) continue; if((m & 0x0F00) >= 0x0700) continue; if((m & 0x00F0) >= 0x0070) continue; if((m & 0x000F) >= 0x0007) continue; B.insert((xy << 16) | m); if(y == 0) B.insert(((xy+8) << 16) | m); if(y != 2) B.insert(((xy+4) << 16) | m); if(y != 0) B.insert(((xy-4) << 16) | m); if(y == 2) B.insert(((xy-8) << 16) | m); if(x == 0) B.insert(((xy+2) << 16) | m); if(x != 2) B.insert(((xy+1) << 16) | m); if(x != 0) B.insert(((xy-1) << 16) | m); if(x == 2) B.insert(((xy-2) << 16) | m); } A = B; if(A.empty()) break; } cout << (A.empty() ? 0 : 1) << endl; } }