[POJ 2585] Window Pains 拓朴排序
题意:你现在有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 拓朴排序的更多相关文章
- POJ 2585.Window Pains 拓扑排序
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1888 Accepted: 944 Descr ...
- poj 2585 Window Pains 解题报告
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2027 Accepted: 1025 Desc ...
- poj 2585 Window Pains 暴力枚举排列
题意: 在4*4的格子中有9个窗体,窗体会覆盖它之下的窗体,问是否存在一个窗体放置的顺序使得最后的结果与输入同样. 分析: 在数据规模较小且不须要剪枝的情况下能够暴力(思路清晰代码简单),暴力一般分为 ...
- POJ 2585 Window Pains 题解
链接:http://poj.org/problem?id=2585 题意: 某个人有一个屏幕大小为4*4的电脑,他很喜欢打开窗口,他肯定打开9个窗口,每个窗口大小2*2.并且每个窗口肯定在固定的位置上 ...
- zoj 2193 poj 2585 Window Pains
拓扑排序. 深刻体会:ACM比赛的精髓之处不在于学了某个算法或数据结构,而在于知道这个知识点但不知道这个问题可以用这个知识去解决!一看题目,根本想不到是拓扑排序.T_T...... #include& ...
- POJ 2585:Window Pains(拓扑排序)
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2524 Accepted: 1284 Desc ...
- Window Pains
http://poj.org/problem?id=2585 Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- POJ2585 Window Pains 拓扑排序
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1843 Accepted: 919 Descr ...
- pojWindow Pains(拓扑排序)
题目链接: 啊哈哈,点我点我 题意: 一快屏幕分非常多区域,区域之间能够相互覆盖,要覆盖就把属于自己的地方所有覆盖. 给出这块屏幕终于的位置.看这块屏幕是对的还是错的.. 思路: 拓扑排序,这个简化点 ...
随机推荐
- LeetCode448-数组中消失的数字
题目 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能 ...
- 【Linux】tcpdump
tcpdump介绍 tcpdump 是一个运行在命令行下的抓包工具.它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包.tcpdump 适用于 大多数的类Unix系统操作系统 ...
- kubernets之secret资源
一 对于一些保密度比较高的文件,k8s又是如何存储的呢? 针对那些保密度比较高的配置文件,例如证书以及一些认证配置不能直接存储在configmap中,而是需要存储在另外一种资源中,需要对存储在里面的 ...
- 单片机—Arduino UNO-R3—学习笔记002
led控制 本篇主要介绍Arduino数字引脚及相关函数,通过数字I/O输出控制板载LED灯亮灭状态(数字引脚13). 数字信号是以0.1表示的电平不连续变化的信号,也就是以二进制的形式表示的信号. ...
- Git安装/VScode+Git+Github
Git安装/VScode+Git+Github 1. 相关简介 git 版本控制工具,支持该工具的网站有Github.BitBucket.Gitorious.国内的OS China仓库.Csdn仓库等 ...
- Nginx(七):location的使用以及nginx关闭原理
上一篇中,我们了解了如何nginx的配置原则及解析框架,以及解析location配置的具体实现,相信大家对该部分已经有了比较深刻的认识. 本篇,我们进一步来了解下,解析之后的配置,如何应用到实际中的吧 ...
- MySQL库和表的操作
MySQL库和表的操作 库操作 创建库 1.1 语法 CREATE DATABASE 数据库名 charset utf8; 1.2 数据库命名规则 可以由字母.数字.下划线.@.#.$ 区分大小写 唯 ...
- tornado大全(甩锅版)
tornado简介 tornado是Python界中非常出名的一款Web框架,和Flask一样它也属于轻量级的Web框架. 但是从性能而言tornado由于其支持异步非阻塞的特性所以对于一些高并发的场 ...
- Dapper原来还可以直接这样写SQL,很强大哦
网络上对Dapper的解释是这样的: Dapper是一个简单的.NET对象映射器,在速度方面具有"King of Micro ORM"的头衔,几乎与使用原始的ADO.NET数据读取 ...
- 淘宝APP消息推送模型
为什么到了2020年,"统一推送联盟"依旧无法起显著作用? - 知乎 https://www.zhihu.com/question/370632447 https://mp.wei ...