POJ 2585 zoj 2193 Window Pains
意思就是窗口覆盖 给出每个窗口能够出现的位置 给出一种情形 问这种情形有木有可能会出现
根据样例给出构造的有向图
如果该点被别的数字覆盖 则可构造出一条有向边 从而构造出一个有向图 如果该图没有环 则该覆盖是合理的 否则是不合理的
通过拓扑排序来判断有没有环
建图的时候 要通过比较点上值的情况 来排除重复的情形!!!!!
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FOV(i,a,b) for(int i=a;i>=b;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define REV(i,a,b) for(int i=a-1;i>=b;i--)
#define MEM(a,x) memset(a,x,sizeof a)
#define ll __int64
using namespace std;
int a[5][5];
int rd[10],map[10][10];
void topsort()
{
int top=-1;
int sta[10];
for(int i=0;i<9;i++)
if(rd[i]==0)
sta[++top]=i;
int sum=0;
while(top>=0)
{
int j=sta[top--];
for(int k=0;k<9;k++)
{
if(map[j][k])
{
// map[j][k]=0;
rd[k]--;
if(rd[k]==0)
sta[++top]=k;
}
}
sum++;
}
if(sum<9) printf("THESE WINDOWS ARE BROKEN\n");
else printf("THESE WINDOWS ARE CLEAN\n");
}
int main()
{
freopen("ceshi.txt","r",stdin);
string aa,b;
b="ENDOFINPUT";
cin>>aa;
while(aa!=b)
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
scanf("%d",&a[i][j]);
cin>>aa;
MEM(rd,0);
MEM(map,0);
int x1,x2,x3,x4;
for(int i=0;i<9;i++)
{
int m=i%3;//列
int n=i/3;//行
x1=a[n][m]; x2=a[n][m+1]; x3=a[n+1][m]; x4=a[n+1][m+1];
if((x1-1)!=i)
{
rd[x1-1]++;
map[i][x1-1]=1;
}
if((x2-1)!=i&&x2!=x1)
{
rd[x2-1]++;
map[i][x2-1]=1;
}
if((x3-1)!=i&&x3!=x1)
{
rd[x3-1]++;
map[i][x3-1]=1;
}
if((x4-1)!=i&&x4!=x2&&x4!=x3)
{
rd[x4-1]++;
map[i][x4-1]=1;
}
}
topsort();
cin>>aa;
}
return 0;
}