POJ 3600 dfs

来源:互联网 发布:php支付宝sdk集成 编辑:程序博客网 时间:2024/05/29 13:43

点击打开链接

题意:给一个小矩阵和一个大矩阵,问你将大矩阵的一些行和一些列去掉后能后变成小矩阵

思路:因为列数只有20,所以dfs爆搜即可,然后行就可以直接判断一下删除一些列后是否还可以满足

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const ll INF=0x3f3f3f3f3f3f3f3fll;const int maxn=30;char str[maxn][maxn];int A[maxn][maxn],B[maxn][maxn],flag,sum[maxn],cnt[maxn];int r,c,R,C;bool vis[maxn];int judge(){    int ff=0;    for(int i=0;i<R;i++){        int fff=0;        for(int j=0;j<C;j++){            if(vis[j]==1) continue;            if(B[i][j]==A[ff][fff]) fff++;        }        if(fff>=c) ff++;    }    if(ff<r) return 0;    return 1;}void dfs(int deep){    int tmp=judge();    if(tmp==0) return ;    if(deep==0) flag=tmp;    if(deep==0||flag) return ;    for(int i=0;i<C;i++){        if(flag) return ;        if(vis[i]==0){            vis[i]=1;            dfs(deep-1);            vis[i]=0;        }    }}int main(){    while(scanf("%d%d",&r,&c)!=-1){        memset(sum,0,sizeof(sum));        for(int i=0;i<r;i++) scanf("%s",str[i]);        for(int i=0;i<r;i++) for(int j=0;j<c;j++) {A[i][j]=str[i][j]-'0';if(A[i][j]==1) sum[i]++;}        scanf("%d%d",&R,&C);        for(int i=0;i<R;i++) scanf("%s",str[i]);        for(int i=0;i<R;i++) for(int j=0;j<C;j++) B[i][j]=str[i][j]-'0';        flag=0;        memset(vis,0,sizeof(vis));        dfs(C-c);        if(flag) printf("Yes\n");        else printf("No\n");    }    return 0;}

0 0
原创粉丝点击