首页 > 代码库 > POJ 3740 Easy Finding(dfs回溯)
POJ 3740 Easy Finding(dfs回溯)
B - Easy Finding
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64uDescription
Given a M× N matrix A. Aij ∈ {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 M, N ( M ≤ 16, N ≤ 300). The next M lines every line contains Nintegers 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
这是一道子集枚举的回溯题,针对当前行选不选进行回溯,并且进行剪枝。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define maxn 1005 int n,m; int a[20][305]; int vis[305]; bool judge(){ for(int i=0;i<n;i++) if(vis[i]==0)return false; return true; } bool judges(){ for(int i=0;i<n;i++) if(vis[i]>1)return false; return true; } bool dfs(int cur) { if(judge())return true; if(cur>=m)return judge(); for(int i=0;i<n;i++){ if(a[cur][i]==1)vis[i]++; } if(judges()){ if(dfs(cur+1))return true; } for(int i=0;i<n;i++){ if(a[cur][i]==1)vis[i]--; } if(dfs(cur+1))return true; return false; } int main() { //freopen("in.txt","r",stdin); while(scanf("%d%d",&m,&n)!=EOF){ for(int i=0;i<m;i++) for(int j=0;j<n;j++) scanf("%d",&a[i][j]); memset(vis,0,sizeof vis); if(dfs(0))puts("Yes, I found it"); else puts("It is impossible"); } }
POJ 3740 Easy Finding(dfs回溯)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。