Easy Finding
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 15668   Accepted: 4163

Description

Given a M×N matrix AAij ∈ {0, 1} (0 ≤ i < M, 0 ≤ j < N), could you find some rows that let every cloumn contains and only contains one 1.

Input

There are multiple cases ended by EOF. Test case up to 500.The first line of input is MN (M ≤ 16, N ≤ 300). The next M lines every line contains N integers separated by space.

Output

For each test case, if you could find it output "Yes, I found it", otherwise output "It is impossible" per line.

Sample Input

3 3
0 1 0
0 0 1
1 0 0
4 4
0 0 0 1
1 0 0 0
1 1 0 1
0 1 0 0

Sample Output

Yes, I found it
It is impossible

Source

题意:

给你一个n*m(n<=16,m<=300)的矩阵。矩阵的每一个元素仅仅能是0或1.如今问你能不能从里面选一些列出来使的没一列有且仅有一个1.

思路:

開始逗比了。把题看成每行仅仅有16个。一看16就乐了。这是典型的壮压嘛。

把每行压成长度为16的二进制数。

然后就是可行性判定了。写完一交re了。

这还用说。

m,n都看错了不re才怪。因为每行值个数太多。不能壮压了。无赖。仅仅能百度。得知是Dancing Links.于是百度其资料。

链接一枚

具体见代码:

#include<iostream>
#include<stdio.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=6010;
int U[maxn],D[maxn],L[maxn],R[maxn],C[maxn];//上下左右指针。 c[i]结点i相应的列。
int S[310],H[310];//S[i]为i列1的个数。H[i]为i行的尾指针。 int n,m,cnt;
void init()
{
int i;
for(i=1;i<=n;i++)
H[i]=-1;
for(i=0;i<=m;i++)
{
S[i]=0;
L[i+1]=i;
R[i]=i+1;
U[i]=D[i]=i;
}
R[m]=0;
cnt=m+1;
}
void Insert(int r,int c)
{ //头插法建链表
U[cnt]=c,D[cnt]=D[c];//确定新增结点上下指针信息
U[D[c]]=cnt,D[c]=cnt;//恢复链表信息
if(H[r]==-1) //确定左右指针信息
H[r]=L[cnt]=R[cnt]=cnt;//增加头
else
{
L[cnt]=H[r],R[cnt]=R[H[r]];//头插法
L[R[H[r]]]=cnt,R[H[r]]=cnt;
}
S[c]++;//更新附加信息
C[cnt++]=c;
}
void Remove(int c)//移除c列。 {
int i,j;
R[L[c]]=R[c],L[R[c]]=L[c];
for(i=D[c];i!=c;i=D[i])
for(j=R[i];j!=i;j=R[j])
D[U[j]]=D[j],U[D[j]]=U[j],S[C[j]]--;
}
void Resume(int c)//还原c列。 {
int i,j;
R[L[c]]=L[R[c]]=c;
for(i=D[c];i!=c;i=D[i])
for(j=R[i];j!=i;j=R[j])
D[U[j]]=U[D[j]]=j,S[C[j]]++;
}
bool dfs()
{
if(R[0]==0)
return true;
int i,j,c,miv=INF;
for(i=R[0];i;i=R[i])
if(S[i]<miv)
miv=S[i],c=i;
Remove(c);//处理第c列
for(i=D[c];i!=c;i=D[i])
{
for(j=R[i];j!=i;j=R[j])
Remove(C[j]);
if(dfs())
return true;
for(j=L[i];j!=i;j=L[j])
Resume(C[j]);
}
Resume(c);
return false;
}
int main()
{
int op,i,j;
while(~scanf("%d%d",&n,&m))
{
init();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&op);
if(op)
Insert(i,j);
}
if(dfs())
printf("Yes, I found it\n");
else
printf("It is impossible\n");
}
return 0;
}

poj 3740 Easy Finding(Dancing Links)的更多相关文章

  1. [ACM] POJ 3740 Easy Finding (DLX模板题)

    Easy Finding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16178   Accepted: 4343 Des ...

  2. poj 3740 Easy Finding 二进制压缩枚举dfs 与 DLX模板详细解析

    题目链接:http://poj.org/problem?id=3740 题意: 是否从0,1矩阵中选出若干行,使得新的矩阵每一列有且仅有一个1? 原矩阵N*M $ 1<= N <= 16 ...

  3. [ACM] POJ 3740 Easy Finding (DFS)

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16202   Accepted: 4349 Description Give ...

  4. poj 3740 Easy Finding 精确匹配

    题目链接 dlx的第一题, 真是坎坷..... #include <iostream> #include <vector> #include <cstdio> #i ...

  5. POJ 3740 Easy Finding

    #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using ...

  6. POJ 3074 Sudoku (Dancing Links)

    传送门:http://poj.org/problem?id=3074 DLX 数独的9*9的模板题. 具体建模详见下面这篇论文.其中9*9的数独怎么转化到精确覆盖问题,以及相关矩阵行列的定义都在下文中 ...

  7. Easy Finding POJ - 3740 (DLX)

    显然这是一道dfs简单题 或许匹配也能做 然而用了dancing links 显然这也是一道模板题 好的吧 调了一上午 终于弄好了模板 Easy Finding Time Limit: 1000MS ...

  8. 【POJ 3740】 Easy Finding

    [题目链接] http://poj.org/problem?id=3740 [算法] Dancing Links算法解精确覆盖问题 详见这篇文章 : https://www.cnblogs.com/g ...

  9. POJ 3740 Dancing Links

    Dancing Links学习:http://www.cnblogs.com/steady/archive/2011/03/15/1984791.html 以及图文学习:http://www.cnbl ...

随机推荐

  1. [svc]linux日志和安全日志

    last详解: http://www.cnblogs.com/kerrycode/p/4223751.html

  2. Centos7安装TensorFlow

    TensorFlow也火了一段时间,想想既然要研究NLP.为什么不好好应用一下Google开源的Deep Learning平台呢,一切还是先从搭建好开发环境開始. 非常多大神们也做了这方面的工作.汲取 ...

  3. 一些常见的关于Linux系统的问题

    1 如何看当前Linux系统有几颗物理CPU和每颗CPU的核数? 答:[root@centos6 ~ 10:55 #35]# cat /proc/cpuinfo|grep -c 'physical i ...

  4. Java高级面试题积累(二)

    简述23种设计 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口.而无需指定它们详细的类. 适配器模式(Adapter):将一个类的接口转换成客户希望的另外 ...

  5. 每日英语:The Biggest Distraction In The Office Is Sitting Next To You

    The big push in office design is forcing co-workers to interact more. Cubicle walls are lower, offic ...

  6. 每日英语:Why 'The Voice' Is China's No. 1 TV Show

    U.S. fans of the hit talent show 'The Voice' may take for granted that its judges sit with their bac ...

  7. linux学习(34):except的安装

    expect据说是交互性很强的脚本语言,但是expect依赖于tcl,但linux系统里一般不自带安装tcl,需要手动安装 expect版本 5.43 http://download.chinauni ...

  8. .net 中异步SOCKET发送数据时碰到的内存问题

    做CS的开发一直都是这样的方式: server端用 C++编写,采用IOCP机制处理大量客户端连接.数据接收发送的问题 client端用 C++ 或C# 写,没什么特殊要求. 最近工作时间上比较宽裕, ...

  9. Echart的基础开发模板

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Ubuntu下迁移MySQL数据库文件目录

    用Ubuntu的apt包管理工具安装的mysql数据库,默认将数据库文件保存在/var/lib/mysql目录下,时间久了数据库越来越大,所以准备挂载个新的硬盘专门存放mysql数据库. 1.确定my ...