拓扑排序:
// ShellDawn
// POJ2585
// No.4
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<string>
#define MM(x) memset(x,0,sizeof(x))
using namespace std;
int M[10][10];
int V[20];
int E[20][20];
const int dirx[] = {0,0,1,1};
const int diry[] = {0,1,1,0};
void init(){
int key = 0;
for(int i=1;i<4;i++){
for(int j=1;j<4;j++){
key++;
for(int k=0;k<4;k++){
int x = i + dirx[k];
int y = j + diry[k];
int loc = M[x][y];
if(loc != key && E[key][loc] == 0){
E[key][loc] = 1;
V[loc]++;
}
}
}
}
}
bool solve(){
int s = 9;
int cnt = 0;
queue<int> q;
while(s>0){
cnt = 0;
for(int i=1;i<=9;i++){
if(V[i] == 0){
cnt++;
s --;
V[i] = -1;
q.push(i);
}
}
if(cnt == 0) return false;
while(!q.empty()){
int loc = q.front();
q.pop();
for(int i=1;i<=9;i++){
if(E[loc][i] == 1){
V[i] -- ;
}
}
}
}
return true;
}
int main(){
//freopen("A.txt","r",stdin);
string s;
while(cin>>s){
if(s == "END") continue;
if(s == "ENDOFINPUT") break;
if(s == "START"){
MM(E);MM(M);MM(V);
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
scanf("%d",&M[i][j]);
}
}
init();
if(solve()){
puts("THESE WINDOWS ARE CLEAN");
}else{
puts("THESE WINDOWS ARE BROKEN");
}
}
}
return 0;
}