构图 然后toposort就OK了
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#include<queue>
using namespace std;
int sx[10]={0,1,1,1,2,2,2,3,3,3};
int sy[10]={0,1,2,3,1,2,3,1,2,3};
int my[4]={0,0,1,1};
int mx[4]={0,1,0,1};
int judge[15][15];
int sum[15];
int a[10][10];
int toposort(){
//printf("yes\n");
int cnt;
queue<int> q;
for(int i=1;i<=9;i++){
if(sum[i]==0) q.push(i);
}
cnt=0;
while(!q.empty()){
//printf("yes\n");
int t=q.front();
q.pop();
cnt++;
for(int i=1;i<=9;i++){
if(judge[t][i]==1) {
sum[i]--;
//judge[t][i]=0;
if(sum[i]==0) q.push(i);
}
}
}
if(cnt==9) return 1;
else
return 0;
}
int main(){
string d="ENDOFINPUT";
string s;
cin>>s;
while(s!=d){
memset(judge,0,sizeof(judge));
memset(sum,0,sizeof(sum));
//printf("yes\n");
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
scanf("%d",&a[i][j]);
}
}
cin>>s;
//printf("yes");
/* for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}*/
for(int i=1;i<=9;i++){
int ssx=sx[i];
int ssy=sy[i];
for(int j=0;j<4;j++){
int nx=ssx+mx[j];
int ny=ssy+my[j];
if(a[nx][ny]!=i&&judge[a[nx][ny]][i]==0){
judge[a[nx][ny]][i]=1;
sum[i]++;
}
}
}
//for(int i=1;i<=9;i++) printf("%d\n",sum[i]);
//printf("yes");
int yes=toposort();
if(yes==1){
printf("THESE WINDOWS ARE CLEAN\n");
}
else if(yes==0){
printf("THESE WINDOWS ARE BROKEN\n");
}
cin>>s;
}
return 0;
}