[poj2585]Window Pains_拓扑排序
Window Pains poj-2585
题目大意:给出一个4*4的方格表,由9种数字组成。其中,每一种数字只会出现在特定的位置,后出现的数字会覆盖之前在当前方格表内出现的。询问当前给出的方格表是否合法。
注释:输入格式需要注意。
想法:toposort裸题,我们先预处理出每一个格子可能出现的数字,如果当前数字根本不可能出现在当前格子里,那么就一定是不合法的。如果满足了第一个条件,那么如果当前数字覆盖了本应该在当前格子里出现的数字,我就以当前数字想本应该出现数字之间连一条有向边。然后,不合法的条件就是出现环,因为不可能出现A覆盖B,B又覆盖A的情况。我们在这里采用toposort判环,如果存在一个点没有进队,那么这组数据就是不合法的。
最后,附上 丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
int cover[110][110][110];//记录当前格子可能出现的数字情况
int tail[110][110];//记录当前格子可能出现的数字个数
bool visit[110];//判断每一个点是否都进过队列
int v[110];//记录每个点的入度
bool map[110][110];//01矩阵,记录两点之间是否存在有向边
int a[110][110];//存储的是当前格子实际存在的数字
using namespace std;
void calc()//预处理每个格子所可能出现的数组(有些麻烦,仅供参考)
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
if(i==1||i==4)
{
if(j==1||j==4) tail[i][j]=1;
else tail[i][j]=2;
}
else
{
if(j==1||j==4) tail[i][j]=2;
else tail[i][j]=4;
}
}
}
cover[1][1][1]=1;
cover[1][2][1]=1;cover[1][2][2]=2;
cover[1][3][1]=2;cover[1][3][2]=3;
cover[1][4][1]=3;
cover[2][1][1]=1;cover[2][1][2]=4;
cover[2][2][1]=1;cover[2][2][2]=2;cover[2][2][3]=4;cover[2][2][4]=5;
cover[2][3][1]=2;cover[2][3][2]=3;cover[2][3][3]=5;cover[2][3][4]=6;
cover[2][4][1]=3;cover[2][4][2]=6;
cover[3][1][1]=4;cover[3][1][2]=7;
cover[3][2][1]=4;cover[3][2][2]=5;cover[3][2][3]=7;cover[3][2][4]=8;
cover[3][3][1]=5;cover[3][3][2]=6;cover[3][3][3]=8;cover[3][3][4]=9;
cover[3][4][1]=6;cover[3][4][2]=9;
cover[4][1][1]=7;
cover[4][2][1]=7;cover[4][2][2]=8;
cover[4][3][1]=8;cover[4][3][2]=9;
cover[4][4][1]=9;
}
bool toposort()//裸toposort(拓扑排序)
{
queue<int>q;
while(q.size()) q.pop();
for(int i=1;i<=9;i++)
{
if(!v[i])
{
q.push(i);visit[i]=true;
}
}
while(q.size())
{
int x=q.front();q.pop();
for(int i=1;i<=9;i++)
{
if(map[x][i])
{
v[i]--;
if(v[i]==0)
{
q.push(i);visit[i]=true;
}
}
}
}
for(int i=1;i<=9;i++)//判断数据是否合法
{
if(!visit[i]) return false;
}
return true;
}
void original()//初始化
{
memset(visit,false,sizeof visit);
memset(v,0,sizeof v);
memset(a,0,sizeof a);
memset(map,false,sizeof map);
}
int main()
{
calc();
while(1)
{
original();
char s[100];
scanf("%s",s+1);
int k_k=strlen(s+1);
if(k_k==10) break;
bool flag=false;//临时记录当前数据是否满足第一个条件
bool all=true;//记录所有数据是否都满足第一个条件
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
scanf("%d",&a[i][j]);
flag=false;
for(int len=1;len<=tail[i][j];len++)
{
if(cover[i][j][len]==a[i][j])
{
flag=true;
}
}
if(!flag) all=false;
}
}
for(int i=1;i<=4;i++)//这里是建图的过程
{
for(int j=1;j<=4;j++)
{
for(int k=1;k<=tail[i][j];k++)
{
if(!map[a[i][j]][cover[i][j][k]]&&a[i][j]!=cover[i][j][k])
{
map[a[i][j]][cover[i][j][k]]=1;
v[cover[i][j][k]]++;
}
}
}
}
if(toposort()&&all) printf("THESE WINDOWS ARE CLEAN\n");//如果满足两个条件,数据才是合法的
else printf("THESE WINDOWS ARE BROKEN\n");
scanf("%s",s+1);
}
return 0;
}
小结:toposort的一个应用,判环。相较于bellmanford的优点就是toposort是O(n),相较于spfa的优点就是没有可以特意hack掉的数据。
[poj2585]Window Pains_拓扑排序的更多相关文章
- POJ2585 Window Pains 拓扑排序
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1843 Accepted: 919 Descr ...
- POJ 2585.Window Pains 拓扑排序
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1888 Accepted: 944 Descr ...
- 【POJ 2585】Window Pains 拓扑排序
Description . . . and so on . . . Unfortunately, Boudreaux's computer is very unreliable and crashes ...
- POJ 2585:Window Pains(拓扑排序)
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2524 Accepted: 1284 Desc ...
- ACM/ICPC 之 拓扑排序范例(POJ1094-POJ2585)
两道拓扑排序问题的范例,用拓扑排序解决的实质是一个单向关系问题 POJ1094(ZOJ1060)-Sortng It All Out 题意简单,但需要考虑的地方很多,因此很容易将code写繁琐了,会给 ...
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
[C#]使用 C# 代码实现拓扑排序 目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...
- pojWindow Pains(拓扑排序)
题目链接: 啊哈哈,点我点我 题意: 一快屏幕分非常多区域,区域之间能够相互覆盖,要覆盖就把属于自己的地方所有覆盖. 给出这块屏幕终于的位置.看这块屏幕是对的还是错的.. 思路: 拓扑排序,这个简化点 ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 有向无环图的应用—AOV网 和 拓扑排序
有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...
随机推荐
- 查看dmp文件
1.查看dmp文件,首先要通过以下的链接地址进行下载 http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.m ...
- 【原】Java学习笔记030 - 异常
package cn.temptation; public class Sample01 { public static void main(String[] args) { /* * 异常:Java ...
- 下拉框的change事件
6.1,获取下拉框的值(html标签中没有onchange事件的) <script language="javascript"> $(document).ready(f ...
- CSS3动画--过渡效果
CSS3动画--过渡效果 transition 设置四个过渡属性 transition-property 过渡的名称 tr ...
- 自己写的,然后配合zepto+iscroll的上拉加载
/** * Created by jl on 2016/3/28. *///初始化绑定iScroll控件var actHtml="";var myScroll, pullUp ...
- order by group by
order by 后 group by连用, mysql好像 >5.4不起作用 通过 explain 查看执行计划,可以看到没有 limit 的时候,少了一个 DERIVED 操作 估计是内部优 ...
- BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)
BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...
- 【BZOJ4698】Sandy的卡片(后缀数组)
[BZOJ4698]Sandy的卡片(后缀数组) 题面 讨厌权限题!!! 因为我交不了... 洛谷 题面 做完差之后就是裸的最长公共子串 没了.. 数组往死里开吧... #include<ios ...
- 【Luogu1345】奶牛的电信(网络流)
[Luogu1345]奶牛的电信(网络流) 题面 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成 ...
- 【Android】[Problem]-"Waiting for target device to come online".
环境: win10专业版(创意者),Android studio 2.3.1 问题描述: 安装玩Android studio之后创建一个项目,建立AVD之后,运行程序时一直不能启动AVD,具体描述为: ...