标签:c++
题意:
有一块4X4的屏幕 屏幕中共有9块固定位置的2X2窗口(相互覆盖) 问窗口是否全部显示正常
题解:
判断所有位置的覆盖情况
如果a覆盖b 则构造一条边edge[b][a]=1 最后得到一个图
这个图一定是无环的 如果有环则表示a覆盖b b又覆盖a
即显示不正常
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int map[15][15];
int indegree[12];
int dir[4][2]= {0,0, 1,0, 0,1, 1,1};
int local[10][2]= {-1,-1, 0,0, 0,1, 0,2, 1,0, 1,1, 1,2, 2,0, 2,1, 2,2}; // 1~9号窗口的固定位置
int screen[5][5];
int topsort()
{
int i,j,loc,flag;
for(i=1; i<=9; i++)
{
flag=0;
for(j=1; j<=9; j++)
if(indegree[j]==0)
{
flag=1;
loc=j;
break;
}
if(flag==0)
return 0;
indegree[loc]=-1;
for(j=1; j<=9; j++)
if(map[loc][j])
indegree[j]--;
}
return 1;
}
int main()
{
char str[20];
int i,j,k;
int x,y,s;
while(scanf("%s",str)&&strcmp(str,"ENDOFINPUT")!=0)
{
memset(map,0,sizeof(map));
memset(indegree,0,sizeof(indegree));
for(i=0; i<4; i++)
for(j=0; j<4; j++)
scanf("%d",&screen[i][j]);
scanf("%s",str);
for(k=1; k<=9; k++)
{
for(i=0; i<4; i++)
{
x=local[k][0]+dir[i][0];
y=local[k][1]+dir[i][1];
s=screen[x][y];
if(s!=k&&!map[k][s])
{
map[k][s]=1;
indegree[s]++;
}
}
}
if(topsort())
cout<<"THESE WINDOWS ARE CLEAN"<<endl;
else
cout<<"THESE WINDOWS ARE BROKEN"<<endl;
}
return 0;
}
标签:c++
原文地址:http://blog.csdn.net/axuan_k/article/details/42966007