zoukankan      html  css  js  c++  java
  • easyfinding(codevs 3280)

    3280 easyfinding

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond
     
     
     
    题目描述 Description

     给一个M 行N  列的01 矩阵,让你选出一些行 (不一定选出全部行)使得每一列都有 
    且只有一个1。其中M<= 16,N<=300 。

    输入描述 Input Description

        输入含有多组数据。以文件结束符(eof )为结束。最多会有500 组。 
        输入之间会有梯度,也就是不是每组输入都是500 组。 
        对每组数据,第一行:两个由空格隔开的整数M 和N 。然后是M 行每行N  个等于0 
    或者等于1 的整数,整数之间由空格隔开。

    输出描述 Output Description

    对每组数据输出一行,如果可以达到题中要求,输出Yes 否则输出No  。均不包括引号。

    样例输入 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 
    No

    (codevs有一个数据让我陷入死循环了,所以在程序中略有改动)
    #include<cstdio>
    #include<iostream>
    #include<vector>
    #include<cstring>
    #define M 310
    using namespace std;
    int map[M][M],n,m,head,tail;
    int v[M][M],q[M],flag;
    struct node
    {
        int vis[M];
    };node a[M];
    int ok(int x)
    {
        for(int i=1;i<=m;i++)
          if(!a[x].vis[i])return 0;
        return 1;
    }
    void init()
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&map[i][j]);
                if(map[i][j])v[i][++v[i][0]]=j;
            }
        }
        while(head<=tail)
        {
            if(tail>10*n)return;//防止死循环(其实就是作弊 >_<~~~) 
            for(int i=1;i<=n;i++)
            {
                q[++tail]=i;
                for(int j=1;j<=m;j++)
                  a[tail].vis[j]=a[head].vis[j];
                
                int ff=0;
                for(int j=1;j<=v[i][0];j++)
                  if(a[tail].vis[v[i][j]])
                    ff=1;
                    
                if(!ff)
                {
                    for(int j=1;j<=v[i][0];j++)
                      a[tail].vis[v[i][j]]=1;
                    if(ok(tail))
                    {
                        printf("Yes
    ");
                        flag=1;
                        return;
                    }
                }
                else tail--;
            }
            head++;
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)==2)
        {
            memset(a,0,sizeof(a));
            memset(v,0,sizeof(v));
            memset(q,0,sizeof(q));
            head=0;tail=0;flag=0;
            init();
            if(!flag)printf("No
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    es6 学习小计
    aligin-items与aligin-content的区别
    编写Shader时的一些性能考虑
    Shader预处理宏、内置状态变量、多版本编译等
    Unity内置的shader include files
    Vertex and Fragment Shader
    对于资源上MissingScript的清理方案讨论
    Surface Shader
    LOD设置
    《蛙》
  • 原文地址:https://www.cnblogs.com/harden/p/5582169.html
Copyright © 2011-2022 走看看