pojWindow Pains(拓扑排序)

题目链接:

啊哈哈,点我点我

题意:

一快屏幕分非常多区域,区域之间能够相互覆盖,要覆盖就把属于自己的地方所有覆盖。

给出这块屏幕终于的位置。看这块屏幕是对的还是错的。。

思路:

拓扑排序,这个简化点说,就是说跟楚河汉界一样。。分的清清楚楚,要么这块地方是我的,要么这块地方是你的,不纯在一人一办的情况,所以假设排序的时候出现了环,那么就说这快屏幕是坏的。。

。另一点细节要注意的是第i个数字究竟属于第几行第几列。所以这个要发现规律,然后一一枚举就能够了。。

题目:

Window Pains

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 1588   Accepted: 792

Description

Boudreaux likes to multitask, especially when it comes to using his computer. Never satisfied with just running one application at a time, he usually runs nine applications, each in its own window. Due to limited screen real estate, he overlaps these windows
and brings whatever window he currently needs to work with to the foreground. If his screen were a 4 x 4 grid of squares, each of Boudreaux‘s windows would be represented by the following 2 x 2 windows:

1 1 . .
1 1 . .
. . . .
. . . .
. 2 2 .
. 2 2 .
. . . .
. . . .
. . 3 3
. . 3 3
. . . .
. . . .
. . . .
4 4 . .
4 4 . .
. . . .
. . . .
. 5 5 .
. 5 5 .
. . . .
. . . .
. . 6 6
. . 6 6
. . . .
. . . .
. . . .
7 7 . .
7 7 . .
. . . .
. . . .
. 8 8 .
. 8 8 .
. . . .
. . . .
. . 9 9
. . 9 9

When Boudreaux brings a window to the foreground, all of its squares come to the top, overlapping any squares it shares with other windows. For example, if window 1and then window 2 were brought to the foreground, the resulting representation
would be:

1 2 2 ?

1 2 2 ?
? ? ? ?

? ?

? ?

If window 4 were then brought to the foreground:
1 2 2 ?
4 4 2 ?

4 4 ? ?

?

? ? ?

. . . and so on . . .

Unfortunately, Boudreaux‘s computer is very unreliable and crashes often. He could easily tell if a crash occurred by looking at the windows and seeing a graphical representation that should not occur if windows were being brought to the foreground correctly.
And this is where you come in . . .

Input

Input to this problem will consist of a (non-empty) series of up to 100 data sets. Each data set will be formatted according to the following description, and there will be no blank lines separating data sets.

A single data set has 3 components:

  1. Start line - A single line:

    START

  2. Screen Shot - Four lines that represent the current graphical representation of the windows on Boudreaux‘s screen. Each position in this 4 x 4 matrix will represent the current piece of window showing in each square. To make input easier, the list of numbers
    on each line will be delimited by a single space.
  3. End line - A single line: 

    END

After the last data set, there will be a single line:

ENDOFINPUT

Note that each piece of visible window will appear only in screen areas where the window could appear when brought to the front. For instance, a 1 can only appear in the top left quadrant.

Output

For each data set, there will be exactly one line of output. If there exists a sequence of bringing windows to the foreground that would result in the graphical representation of the windows on Boudreaux‘s screen, the output will be a single line with the statement:

THESE WINDOWS ARE CLEAN

Otherwise, the output will be a single line with the statement:

THESE WINDOWS ARE BROKEN

Sample Input

START
1 2 3 3
4 5 6 6
7 8 9 9
7 8 9 9
END
START
1 1 3 3
4 1 3 3
7 7 9 9
7 7 9 9
END
ENDOFINPUT

Sample Output

THESE WINDOWS ARE CLEAN
THESE WINDOWS ARE BROKEN

Source

South Central USA 2003

代码为:

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=5+10;
int map[maxn][maxn],in[maxn];

queue<int>Q;
vector<int>vec[maxn];
int dx[]={0,0,1,1};
int dy[]={0,1,0,1};

int topo()
{
    int sum=9;
    while(!Q.empty())  Q.pop();
    for(int i=1;i<=9;i++)
    {
        if(in[i]==0)
            Q.push(i);
    }
    while(!Q.empty())
    {
        int temp=Q.front();
        Q.pop();
        sum--;
        for(int i=0;i<vec[temp].size();i++)
        {
            if(--in[vec[temp][i]]==0)
                Q.push(vec[temp][i]);
        }
    }
    if(sum>0)  return 0;
    else    return 1;
}

void init()
{
    char str[10];
    for(int i=1;i<=9;i++)
    {
        vec[i].clear();
        in[i]=0;
    }
    for(int i=1;i<=9;i++)
    {
        int x=(i-1)/3+1;
        int y=i%3==0?

3:i%3;
        for(int j=0;j<=3;j++)
        {
             int tx=x+dx[j];
             int ty=y+dy[j];
             if(map[tx][ty]!=i)
             {
                 vec[i].push_back(map[tx][ty]);
                 in[map[tx][ty]]++;
             }
        }
    }
    scanf("%s",str);
}

void solve()
{
    int  ans=topo();
    if(ans)
        cout<<"THESE WINDOWS ARE CLEAN"<<endl;
    else
        cout<<"THESE WINDOWS ARE BROKEN"<<endl;
}

int main()
{
    char str[10];
    while(~scanf("%s",str))
    {
        if(strcmp(str,"ENDOFINPUT")==0)  return 0;
        for(int i=1;i<=4;i++)
            for(int j=1;j<=4;j++)
              scanf("%d",&map[i][j]);
        init();
        solve();
    }
    return 0;
}

时间: 2024-10-06 04:11:45

pojWindow Pains(拓扑排序)的相关文章

poj 2585 Window Pains(拓扑排序)(经典)(困难)

Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1756   Accepted: 881 Description Boudreaux likes to multitask, especially when it comes to using his computer. Never satisfied with just running one application at a time, he u

POJ 2585 Window Pains 拓扑排序

poj2585 题意: 有一块4X4的屏幕   屏幕中共有9块固定位置的2X2窗口(相互覆盖)  问窗口是否全部显示正常 题解: 判断所有位置的覆盖情况 如果a覆盖b 则构造一条边edge[b][a]=1    最后得到一个图 这个图一定是无环的   如果有环则表示a覆盖b   b又覆盖a 即显示不正常 代码: #include<cstdio> #include<cstring> #include<iostream> using namespace std; int m

POJ 2585 Window Pains(拓扑排序&#183;窗口覆盖)

题意  有一个4*4的显示器  有9个程序  每个程序占2*2个格子  他们的位置如图所示  当你运行某个程序时  这个程序就会显示在顶层覆盖其它的程序  给你某个时刻显示器的截图  判断此时电脑是否死机了(出现了不合法的覆盖关系) 拓扑排序的应用  关键是建图  当一个程序A的区域上有其它程序B时  说明A是在B之前运行的  那么我们可以建立一个A<B的拓扑关系  最后判断是否有环就行了  个人认为下标换为0操作起来比较方便  所以都还为了0 #include <cstdio> #in

POJ--2585--Window Pains【拓扑排序】

链接:http://poj.org/problem?id=2585 题意:有一个4*4的屏幕,有9个窗口各占2*2大小,保证不会存在一个窗口完全覆盖任一个窗口,但每个窗口都会部分被其他窗口覆盖(因为4*4和2*2 = =.)现在需要你判断电脑是否死机.(死机的话会出现无法判断A覆盖B还是B覆盖A的情况) 思路:无法判断A覆盖B还是B覆盖A,可以当做是图中A和B之间存在环,我们可以把每个窗口当做一个顶点,如果A覆盖了B,就以A为起点.B为终点连一条有向边,这样建完图之后入度为0的点就是没有没覆盖的

拓扑排序讲解

在这里我们要说的拓扑排序是有前提的 我们在这里说的拓扑排序是基于有向无环图的!!!. (⊙o⊙)…我所说的有向无环图都知道是什么东西吧.. 如果不知道,我们下面先来来说说什么是有向无环图. 所谓有向无环图,顾名思义是不存在环的有向图(至于有向图是什么不知道的在前面我们有一个图论讲解上都有). 点的入度:以这个点为结束点的边数. 点的出度:以这个点为出发点的边的条数. 拓扑序就是对于一个节点的一个排列,使得(u,v)属于E,那么u一定出现在v的前面.然而拓扑排序就是一个用来求拓扑序的东西. 对于左

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

7-9-有向图无环拓扑排序-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向无环图拓扑排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceStack.c.ALGraph.c    

hihoCoder 1175:拓扑排序二

题目链接: http://hihocoder.com/problemset/problem/1175 题目难度:一星级(简单题) 今天闲来无事,决定刷一道水题.结果发现这道水题居然把我卡了将近一个钟头. 最后终于调通了.总结起来,原因只有一个:不够仔细. 思路不用细说了,就是拓扑排序的简单应用.然而,一些不起眼的细节才是让你掉坑里的真正原因. 猜猜哪儿可能出bug? // A simple problem, but you can't be too careful with it. #inclu

hdu1285(拓扑排序)

这道题要求没有输赢关系的两个元素必须按照升序输出,有输赢关系的,赢得在输的前面,所以用队列或者栈来降低时间复杂度的优化过的拓扑排序会出错. 比如这组输入 5 3 1 2 2 3 4 5 至少我写的两种拓扑排序都wa了.但是不用队列或者栈来优化的话, 1.每次都从头至尾扫描一遍,找到一个没标记过的节点, 2.将它标记 3.然后删除从它出来的每条边. 重复这三个操作,加标记的次序,就是题目要的答案. 下面的代码中用到了队列,但只是用来保存答案而已.并没有用它优化的意思. #include <iost