poj 2585 Window Pains

简介:

  

     格子覆盖问题,有两种方法。

 

     1.可以当做一道模拟题,每次找到一块完整的玻璃,将其取下,看最后能否将所有玻璃取下即可,因为数据量比较少,所以复杂度很低。

 

     2.可以看成一个AOV网络,寻找拓扑排序,看是否存在环,我就这样写的,但是昨晚把topo的dfs写错了o(╯□╰)o,今早查书才发现,dfs的拓扑是从后往前做topo,所以发现已存在在序列中的点是木有影响的。

 

/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#define INF 1E9
using namespace std;
vector<int> map[16];
bool ok[10][10];
int vis[10];
void init()//确定每个点对应的窗口号
{
    int i,now=0;
    for(i=1;i<10&&now<15;i++)
    {
        map[now].push_back(i);
        map[now+1].push_back(i);
        map[now+4].push_back(i);
        map[now+5].push_back(i);
        now++;
        if(i%3==0)now++;
    }
    return;
}
bool dfs(int m)
{
    int i;
    vis[m]=-1;
    for(i=1;i<10;i++)
    {
        if(!ok[m][i])continue;
        if(vis[i]<0)return 0;//存在环
        if(!vis[i]&&!dfs(i))return 0;
    }
    vis[m]=1;
    return 1;
}
bool topo()
{
    for(int i=1;i<10;i++)
      if(!vis[i]&&!dfs(i))return 0;//增加人为排序
    return 1;
}
int main()
{
    init();
    string s;
    int i,t,j;
    while(cin>>s&&s!="ENDOFINPUT")
    {
        memset(vis,0,sizeof(vis));
        memset(ok,0,sizeof(ok));
        for(i=0;i<16;i++)
        {
           scanf("%d",&t);
           for(j=0;j<map[i].size();j++)
           {
               if(t==map[i][j])continue;
               ok[t][map[i][j]]=1;
           }
        }
        if(topo())cout<<"THESE WINDOWS ARE CLEAN"<<endl;
        else cout<<"THESE WINDOWS ARE BROKEN"<<endl;
        cin>>s;
    }
}


 

目录
相关文章
|
6月前
|
算法
poj 2823 Sliding Window
让你设计一个队列,是其求里面最大值的时间复杂度尽可能的低,但这个队列除了最大值外,就是一个普通的队列,该怎么进出还是怎么进出,并不是优先队列。
20 0
|
5月前
Leetcode 623. Add One Row to Tree
题目很简单,在树的第d层加一层,值为v。递归增加一层就好了。代码如下
25 0
|
索引
LeetCode 76. Minimum Window Substring
给定一个字符串S和一个字符串T,找到S中的最小窗口,它将包含复杂度为O(n)的T中的所有字符。
46 0
LeetCode 76. Minimum Window Substring
|
数据库 C语言
LeetCode 72. Edit Distance
给定两个单词word1和word2,找到将word1转换为word2所需的最小操作数。 您对单词允许以下3个操作: 插入一个字符 删除一个字符 替换一个字符
42 0
LeetCode 72. Edit Distance
|
Swift iOS开发
Xcode10 NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END
前言 升级成 Xcode 10 之后每次 New File 看到 .h 基本都能看到 NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END 成对出现在 @interface 与 @end 上下, 包裹住它, 这两对关键字并非新特性, 只是 Xcode 10 之后系统默认实现了, 应该是考虑到与 Swift 混编, 为了更好兼容其 optional 与 non-optional。
1794 0

热门文章

最新文章