[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(拓扑排序)
题目链接: 啊哈哈,点我点我 题意: 一快屏幕分非常多区域,区域之间能够相互覆盖,要覆盖就把属于自己的地方所有覆盖. 给出这块屏幕终于的位置.看这块屏幕是对的还是错的.. 思路: 拓扑排序,这个简化点 ...
随机推荐
- Tomcat-8.5.23 基于域名和端口的虚拟主机
下载tomcat yum install java -y cd /opt/ wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.23/b ...
- MySQL的CURD 增删改查
添加 insert 语法: 单条:insert into 表名('字段1', '字段2', ...) values('值1', '值2', ...) 多条:insert into 表名('字段1', ...
- 如何构建一个多人(.io) Web 游戏,第 2 部分
原文:How to Build a Multiplayer (.io) Web Game, Part 2 探索 .io 游戏背后的后端服务器. 上篇:如何构建一个多人(.io) Web 游戏,第 1 ...
- LeetCode108.有序数组转二叉搜索树
题目 1 class Solution { 2 public: 3 TreeNode* sortedArrayToBST(vector<int>& nums) { 4 if(num ...
- Kioptix Level 1
1. 简介 Vulnhub是一个提供各种漏洞环境的靶场平台. 个人学习目的:1,方便学习更多类型漏洞.2,为OSCP做打基础. 下载链接 https://www.vulnhub.com/entry/k ...
- 【1w字+干货】第一篇,基础:让你的 Redis 不再只是安装吃灰到卸载(Linux环境)
Redis 基础以及进阶的两篇已经全部更新好了,为了字数限制以及阅读方便,分成两篇发布. 本篇主要内容为:NoSQL 引入 Redis ,以及在 Linux7 环境下的安装,配置,以及总结了非常详细的 ...
- 基于循环队列的BFS的原理及实现
文章首发于微信公众号:几何思维 1.故事起源 有一只蚂蚁出去寻找食物,无意中进入了一个迷宫.蚂蚁只能向上.下.左.右4个方向走,迷宫中有墙和水的地方都无法通行.这时蚂蚁犯难了,怎样才能找出到食物的最短 ...
- grpc-metadata
https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md https://github.com/grpc/g ...
- HTTP/2与HTTP/3的新特性
解密HTTP/2与HTTP/3的新特性 - InfoQ https://www.infoq.cn/article/kU4OkqR8vH123a8dLCCJ
- 排查golang的性能问题 go pprof 实践
小结: 1.内存消耗分析 list peek 定位到函数 https://mp.weixin.qq.com/s/_LovnIqJYAuDpTm2QmUgrA 使用pprof和go-torch排查 ...