dfs
View Code
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define maxn 20
#define maxm 305
int n, m;
int map[maxn][maxm];
int num[maxn];
bool g[maxn][maxn];
int rownum[maxn];
bool found;
void input()
{
memset(num, 0, sizeof(num));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
int a;
scanf("%d", &a);
if (a == 0)
map[i][j] = 0;
else
{
map[i][j] = 1;
num[i]++;
}
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
bool ok = true;
for (int k = 0; k < m; k++)
if (map[i][k] && map[j][k])
{
ok = false;
break;
}
if (ok)
g[i][j] = true;
else
g[i][j] = false;
}
}
void dfs(int tot, int now, int ans)
{
if (found)
return;
if (now == n)
{
if (ans == m)
found = true;
return;
}
dfs(tot, now + 1, ans);
bool ok = true;
for (int i = 0; i < tot; i++)
if (!g[rownum[i]][now])
{
ok = false;
break;
}
if (ok)
{
rownum[tot] = now;
dfs(tot + 1, now + 1, ans + num[now]);
}
}
int main()
{
//freopen("t.txt", "r", stdin);
while (scanf("%d%d", &n, &m) != EOF)
{
found = false;
input();
dfs(0, 0, 0);
if (found)
printf("Yes, I found it\n");
else
printf("It is impossible\n");
}
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110591.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...