POJ 3600 dfs
阿新 • • 發佈:2019-02-20
題意:給一個小矩陣和一個大矩陣,問你將大矩陣的一些行和一些列去掉後能後變成小矩陣
思路:因為列數只有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; }