[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) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...
随机推荐
- FusionCharts 3D环饼图
1.设计静态页面 Doughnut.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"& ...
- Srtuts2实现登录界面(不连接数据库)报错(一)
二月 28, 2014 11:32:02 下午 org.apache.catalina.core.AprLifecycleListener init 严重: An incompatible versi ...
- JAVA几种缓存技术介绍说明
OSCache OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案. OSCache有以下特点: 我创建了一个群,群里不定期分享技术 ...
- RSS简介
1.RSS(Really Simple Syndication)简介 1.定义 对于网站:RSS 是一种使用 XML 向许多其他的网站分发自己网站上的网络内容的方法. 对于用户:RSS ...
- 使用Spring-hadoop小结
SpringHadoop是通过Spring框架来调用hdfs,跟直接调用hdfs的最大的不同区别是Spring通过依赖注入的方式生成操作hdfs所需要的configuration和filesystem ...
- enable_shared_from_this类的作用和实现
使用举例 实际中, 经常需要在一个被shared_ptr管理的对象的内部获取自己的shared_ptr. 比如: 通过this指针来构造一个shared_ptr, 如下: struct Bad { v ...
- MSIL实用指南-加载bool、sbyte、byte、char、short等值
这一篇讲解怎么加载bool值.sbyte值.byte值.char值.short值. 加载bool值在.NET程序实际运行中,是没有true和false值的,实际上是以1和0表示它们,加载它们的指令是L ...
- redis缓存的应用详解
在现在的很多项目,基本上都需要引入缓存机制,那么缓存到底是什么呢? 缓存 也就是数据交互的缓冲区 Cache 在java-web项目中实现缓存,也就是需要首先把数据库需要用到的数据备份一份作为副本 ...
- unity(c# ioc框架) 使用总结
这里的unity指的是完成依赖注入的unity而不是游戏引擎. 原本项目完成依赖注入用的是spring.net,但是spring.net已经很久没人维护了,所以微软官方推出的Unity成为了替代spr ...
- 【python学习笔记】10.充电时刻
[python学习笔记]10.充电时刻 任何python都可以作为模块倒入 *.pyc:平台无关的经过编译的的python文件, 模块在第一次导入到程序中时被执行,包括定义类,函数,变量,执行语句 可 ...