拓扑排序
因为一个窗口和一个窗口有上下之分,也就是有先后之分,若显示没有问题,则存在拓扑排序,否则不存在。
最下层窗口为有向图的起点,最上层为终点。构建关系图即可。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int map[10][10],ori[5][5],degree[10];
int move[4][2]={0,0,0,1,1,0,1,1};
int dir[10][2]={-1,-1,0,0,0,1,0,2,1,0,1,1,1,2,2,0,2,1,2,2};
int topo(){ //判断是否存在环
int num=0,flag;
while(num<9){
flag=0;
for(int i=1;i<=9;++i){
if(degree[i]==0){
degree[i]--;
num++;
flag=1;
for(int j=1;j<=9;++j) if(map[i][j]) degree[j]--;
break;
}
}
if(!flag) return 0;
}
return 1;
}
int main()
{
string s;
while(cin>>s,s!="ENDOFINPUT"){
for(int i=0;i<4;++i)
for(int j=0;j<4;++j){
scanf("%d",&ori[i][j]);
}
cin>>s;
memset(map,0,sizeof(map));
memset(degree,0,sizeof(degree));
int n_x,n_y;
for(int z=1;z<=9;++z){
for(int i=0;i<4;++i){
n_x=dir[z][0]+move[i][0];
n_y=dir[z][1]+move[i][1];
if(ori[n_x][n_y]!=z&&!map[z][ori[n_x][n_y]]){
map[z][ori[n_x][n_y]]=1;
degree[ori[n_x][n_y]]++;
}
}
}
int ans=topo();
if(ans) printf("THESE WINDOWS ARE CLEAN\n");
else printf("THESE WINDOWS ARE BROKEN\n");
}
return 0;
}