[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) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...
随机推荐
- IBM Rational AppScan:跨站点脚本攻击深入解析
IBM Rational AppScan:跨站点脚本攻击深入解析 了解黑客如何启动跨站点脚本攻击(cross-site scripting,XSS),该攻击危害(及不危害)什么,如何检测它们,以 ...
- WebService之CXF注解之三(Service接口实现类)
ITeacherServiceImpl.java: /** * @Title:ITeacherServiceImpl.java * @Package:com.you.service.impl * @D ...
- My97 DatePicker普通调用
My97 DatePicker普通调用 1.设计源码 <%@ page language="java" import="java.util.*" page ...
- freemarker报错之七
1.错误描述 五月 30, 2014 11:33:57 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
- 使用Gulp进行代码压缩的步骤以及配置
一.安装步骤 1.首先确定是否安装了node.js,如果未安装,请先安装node.js: 2.确定是否安装了包管理工具npm,如未安装请安装:npm install npm -g: 3.安装gulp: ...
- BFS学习 Codeforces 301_div.2_Ice Cave
C. Ice Cave time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- Python基础_函数2
在介绍完函数的大体概念如定义.传参.作用域之后,本节主要介绍函数的几个细节部分. 一. print()函数与return的区别. 相同点:print与return都是向用户在输出界面上展示结果 不同点 ...
- SpringMVC 框架系列之组件概述与配置详解
在上一篇文章 SpringMVC 框架系列之初识与入门实例 的实例中,我们已经知道,SpringMVC 框架是一个 web 层的框架,本篇文章就详细解释一下 SpringMVC 框架具体文件的配置以及 ...
- [Luogu4149][IOI2011]Race
BZOJ权限题qwq Luogu sol 树上路径当然是淀粉质辣! 考虑所有过重心的路径.开一个\(10^6\)大小的数组\(t\)表示某一路径长度的最小边数,初始化为\(inf(i>0)\), ...
- 杜教筛:Bzoj3944: sum
题意 求\(\sum_{i=1}^{n}\varphi(i)和\sum_{i=1}^{n}\mu(i)\) \(n <= 2^{31}-1\) 不会做啊... 只会线性筛,显然不能线性筛 这个时 ...