题意:你现在有9个2*2的窗口在4*4的屏幕上面,由于这9这小窗口叠放顺序不固定,所以在4*4屏幕上有些窗口只会露出来一部分。

如果电脑坏了的话,那么那个屏幕上的各小窗口叠放会出现错误。你的任务就是判断一下这个电脑到底坏了没有。

讲题之前简单说一下拓扑排序是干啥的:

它是对有向图顶点的一种排序方式,而且拓扑排序的结果可能不止一种

正常步骤为(方法不一定唯一)

  • 从DGA图(有向无环图)中找到一个没有前驱的顶点输出。(可以遍历,也可以用优先队列维护)
  • 删除以这个点为起点的边。(它的指向的边删除,为了找到下个没有前驱的顶点)
  • 重复上述,直到最后一个顶点被输出。如果还有顶点未被输出,则说明有环!

具体过程请见:传送门

题解:

要注意1.2.3....9这几个窗口的位置是不变的,它只会被其他窗口挡住

刚开始我想的是,让这9个窗口叠放的顺序枚举一下,记录下来它最后的结果(结果也就9!个)。然后对每一次输入找一下这里面有没有这个结果。

但是感觉这个太麻烦了!!!

还可以使用拓扑排序,对每一个窗口的位置进行枚举,如果这4个位置上面的值与此时窗口的标号不同,那就证明这几个窗口叠放顺序要在它之后。就建一条边。

假设这个是1窗口,那么它的四个位置上面应该都是1,如果出现了2或者3等等,那就证明2或者3等等窗口叠放顺序在1窗口之后。那就给1建一条从1到2或者3等等窗口的边。这就表明了在这种叠放顺序中只有让2或者3等等窗口拿走后1窗口才会全部展现出来

输入中肯定有至少一个窗口的所有位置都没有被其他窗口占用,那么拓扑排序就从这里开始。就把这个窗口拿走还要把与这个窗口的边也取消掉

代码:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<vector>
6 #include<queue>
7 using namespace std;
8 const int maxn=10;
9 int mp[5][5],quality[maxn],link[10][10];
10 char s[2*maxn];
11 bool check()
12 {
13 for(int i=1;i<=9;++i)
14 {
15 if(quality[i]>0)
16 {
17 return false;
18 }
19 }
20 return true;
21 }
22 int main()
23 {
24 while(~scanf("%s",s))
25 {
26
27 if(strcmp(s,"START")==0)
28 {
29 memset(quality,0,sizeof(quality));
30 memset(link,0,sizeof(link));
31 for(int i=1;i<=4;++i)
32 {
33 for(int j=1;j<=4;++j)
34 {
35 scanf("%d",&mp[i][j]);
36 }
37 }
38 scanf("%s",s);
39 int cnt=0;
40 for(int i=0;i<=2;++i)
41 {
42 for(int j=0;j<=2;++j)
43 {
44 cnt++;
45 //printf("%d\n",cnt);
46 for(int ii=i+1;ii<=i+2;++ii)
47 {
48 for(int jj=j+1;jj<=j+2;++jj)
49 {
50 int u=mp[ii][jj];
51 if(u!=cnt)
52 {
53 link[cnt][u]++;
54 quality[cnt]++;
55 }
56 }
57 }
58 }
59 }
60 queue<int>r;
61 while(!r.empty()) r.pop();
62 for(int i=1;i<=9;++i)
63 {
64 if(quality[i]==0)
65 {
66 r.push(i);
67 quality[i]=-1;
68 }
69 }
70 while(!r.empty())
71 {
72
73 int x=r.front();
74 r.pop();
75 for(int i=1;i<=9;++i)
76 {
77 if(i==x) continue;
78 if(link[i][x])
79 {
80 //printf("%d %d %d %d\n",x,i,quality[i],link[i][x]);
81 quality[i]-=link[i][x];
82 link[i][x]=0;
83 if(quality[i]==0)
84 {
85 quality[i]=-1;
86 r.push(i);
87 }
88 }
89 }
90 }
91 if(check())
92 printf("THESE WINDOWS ARE CLEAN\n");
93 else printf("THESE WINDOWS ARE BROKEN\n");
94 }
95 else break;
96 }
97 return 0;
98 }

[POJ 2585] Window Pains 拓朴排序的更多相关文章

  1. POJ 2585.Window Pains 拓扑排序

    Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1888   Accepted: 944 Descr ...

  2. poj 2585 Window Pains 解题报告

    Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2027   Accepted: 1025 Desc ...

  3. poj 2585 Window Pains 暴力枚举排列

    题意: 在4*4的格子中有9个窗体,窗体会覆盖它之下的窗体,问是否存在一个窗体放置的顺序使得最后的结果与输入同样. 分析: 在数据规模较小且不须要剪枝的情况下能够暴力(思路清晰代码简单),暴力一般分为 ...

  4. POJ 2585 Window Pains 题解

    链接:http://poj.org/problem?id=2585 题意: 某个人有一个屏幕大小为4*4的电脑,他很喜欢打开窗口,他肯定打开9个窗口,每个窗口大小2*2.并且每个窗口肯定在固定的位置上 ...

  5. zoj 2193 poj 2585 Window Pains

    拓扑排序. 深刻体会:ACM比赛的精髓之处不在于学了某个算法或数据结构,而在于知道这个知识点但不知道这个问题可以用这个知识去解决!一看题目,根本想不到是拓扑排序.T_T...... #include& ...

  6. POJ 2585:Window Pains(拓扑排序)

    Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2524   Accepted: 1284 Desc ...

  7. Window Pains

    http://poj.org/problem?id=2585 Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  8. POJ2585 Window Pains 拓扑排序

    Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1843   Accepted: 919 Descr ...

  9. pojWindow Pains(拓扑排序)

    题目链接: 啊哈哈,点我点我 题意: 一快屏幕分非常多区域,区域之间能够相互覆盖,要覆盖就把属于自己的地方所有覆盖. 给出这块屏幕终于的位置.看这块屏幕是对的还是错的.. 思路: 拓扑排序,这个简化点 ...

随机推荐

  1. 详解 TCP的三次握手四次挥手

    本文转载来自https://blog.csdn.net/qzcsu/article/details/72861891 背景描述 通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之 ...

  2. g/test/s/lose/won/g

    包含字符串test的任意行商,用lose代替won

  3. VB基础总结

    前段时间用VB写了一个简单窗口小应用,久了不碰VB,都忘了,下面用思维导图简单总结了一些基础的东西,方便以后快速查阅.

  4. CMU数据库(15-445)实验2-B+树索引实现(下+课上笔记)

    4. Index_Iterator实现 这里就是需要实现迭代器的一些操作,比如begin.end.isend等等 下面是对于IndexIterator的构造函数 template <typena ...

  5. idea maven package报错"不再支持源选项 5 请使用 6 或更高版本。不支持发行版本 5"

    解决办法: 1.确保java compile以及project和module的java字节码版本是所用的java版本:

  6. Lambda架构正是这样一种用来处理不能够直接实时计算问题的通用架构

    https://mp.weixin.qq.com/s/BGHOw12iCASJy1pgkYZi3w 当数据处理做不到实时,应该怎么办?

  7. 一致性哈希算法C#实现

    一致性hash实现,以下实现没有考虑多线程情况,也就是没有加锁,需要的可以自行加上.因为换行的问题,阅读不太方便,可以拷贝到本地再读. 1 /// <summary> 2 /// 一致性哈 ...

  8. HTTPS学习(二):原理与实践

    div.example { background-color: rgba(229, 236, 243, 1); color: rgba(0, 0, 0, 1); padding: 0.5em; mar ...

  9. <script>元素

    简介 向HTML页面中插入JavaScript的主要方法,就是使用'<'script'>'元素. 标签的位置 现代Web应用程序一般都把全部的JavaScript饮用放在'<'bod ...

  10. springboot2.2.2集成6.5 Elasticsearch

    1.0POM文件 <!-- spring-boot --> <dependency> <groupId>org.springframework.boot</g ...