码迷,mamicode.com
首页 > 编程语言 > 详细

POJ 2585 Window Pains 拓扑排序

时间:2015-01-21 13:33:55      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:c++

poj2585 




题意:

有一块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;
}


POJ 2585 Window Pains 拓扑排序

标签:c++

原文地址:http://blog.csdn.net/axuan_k/article/details/42966007

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!