题意:给你屏幕上窗口的覆盖关系,问你能否通过初始的9个窗口覆盖得到。
思路:通过拓扑排序判断是否成环。一想到这就很简单了。
因为最后输出字符串写错了。。狂WA。。囧。。
#include <cstdio>
#include <algorithm>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<vector>
#include<stack>
using namespace std;
int main()
{
string str;
while(cin>>str&&str!="ENDOFINPUT")
{
int Mat[5][5];
for(int i=1; i<=4; ++i)
for(int j=1; j<=4; ++j)
scanf("%d",&Mat[i][j]);
cin>>str;
vector<int> adjlist[10];
int in[10]= {0};
int val=0;
for(int i=1; i<=3; ++i)
for(int j=1; j<=3; ++j)
{
val++;
if(adjlist[Mat[i][j]].end()==find(adjlist[Mat[i][j]].begin(),adjlist[Mat[i][j]].end(),val)&&val!=Mat[i][j])
{
in[val]++;
adjlist[Mat[i][j]].push_back(val);
}
if(adjlist[Mat[i+1][j]].end()==find(adjlist[Mat[i+1][j]].begin(),adjlist[Mat[i+1][j]].end(),val)&&val!=Mat[i+1][j])
{
in[val]++;
adjlist[Mat[i+1][j]].push_back(val);
}
if(adjlist[Mat[i][j+1]].end()==find(adjlist[Mat[i][j+1]].begin(),adjlist[Mat[i][j+1]].end(),val)&&val!=Mat[i][j+1])
{
in[val]++;
adjlist[Mat[i][j+1]].push_back(val);
}
if(adjlist[Mat[i+1][j+1]].end()==find(adjlist[Mat[i+1][j+1]].begin(),adjlist[Mat[i+1][j+1]].end(),val)&&val!=Mat[i+1][j+1])
{
in[val]++;
adjlist[Mat[i+1][j+1]].push_back(val);
}
}
stack<int> q;
for(int i=1; i<=9; ++i)
if(in[i]==0) q.push(i);
int cou=0;
while(!q.empty())
{
int gettop=q.top();
q.pop();
cou++;
for(int i=0; i<adjlist[gettop].size(); ++i)
{
in[adjlist[gettop][i]]--;
if(in[adjlist[gettop][i]]==0)
q.push(adjlist[gettop][i]);
}
}
if(cou==9)
puts("THESE WINDOWS ARE CLEAN");
else
puts("THESE WINDOWS ARE BROKEN");
}
return 0;
}