#include #include #include #include using namespace std; struct Country { public: int norain[4][4]; int day, x, y; int operator <(Country c) const { if (x < c.x) return 1; if (x > c.x) return 0; if (y < c.y) return 1; if (y > c.y) return 0; for (int i =0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (norain[i][j] < c.norain[i][j]) return 1; if (norain[i][j] > c.norain[i][j]) return 0; } } return 0; } }; typedef set Cntset; int main() { int N; ifstream is("weather.txt"); while ((is >> N), N > 0) { int market[365][8][8]; for (int i = 0; i < N; i++) { for (int j = 0; j < 8; j++) { for (int k = 0; k < 8; k++) { market[i][j][k] = 1; } } for (int j = 2; j < 6; j++) { for (int k = 2; k < 6; k++) { is >> market[i][j][k]; } } } Country c0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { c0.norain[i][j] = 0; } } c0.x = c0.y = 1; Cntset cnts, nextcnts; cnts.insert(c0); for (int day = 0; day < N; day++) { int dx[] = {-2, -1, 1, 2, 0, 0, 0, 0, 0}; int dy[] = {0, 0, 0, 0, -2, -1, 1, 2, 0}; nextcnts.clear(); for (Cntset::iterator ii = cnts.begin(); ii != cnts.end(); ii++) { Country tmp = *ii; if (market[day][tmp.x+2][tmp.y+2] == 1) continue; if (market[day][tmp.x+3][tmp.y+2] == 1) continue; if (market[day][tmp.x+2][tmp.y+3] == 1) continue; if (market[day][tmp.x+3][tmp.y+3] == 1) continue; tmp.norain[ii->x][ii->y] = -1; tmp.norain[ii->x][ii->y+1] = -1; tmp.norain[ii->x+1][ii->y] = -1; tmp.norain[ii->x+1][ii->y+1] = -1; for(int i= 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (++tmp.norain[i][j] > 6) goto nextcnt; } } for (int i = 0; i < 9; i++) { if (tmp.x+dx[i] < 0 || tmp.x+dx[i] > 3) continue; if (tmp.y+dy[i] < 0 || tmp.y+dy[i] > 3) continue; tmp.x += dx[i]; tmp.y += dy[i]; nextcnts.insert(tmp); tmp.x -= dx[i]; tmp.y -= dy[i]; } nextcnt: ; } cnts = nextcnts; } cout << !cnts.empty() << endl; } }