题意:
有一块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; }
时间: 2024-11-05 12:20:24