题目传送门:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
int a;
int F[110];
int dp[1<<20];
int main()
{
memset(dp,-1,sizeof(dp));
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
int tmp=0;
for(int j=1;j<=k;j++)
{
cin>>a;
tmp|=(1<<(a-1));//确定每行状态
}
F[i]=tmp;
dp[tmp]=1;//达到初始状态需要的次数是一
}
for(int i=0;i<(1<<m);i++)//遍历所有情况
{
if(dp[i]!=-1)//如果这种情况存在
{
for(int j=1;j<=n;j++)//遍历所有初始情况
{
if(dp[i|F[j]]==-1)//本情况和某个初始情况结合之后未出现过
{
dp[i|F[j]]=dp[i]+1;//新情况的结合需要的次数就是本情况加一
}
dp[i|F[j]]=min(dp[i|F[j]],dp[i]+1);//算出最少情况
}
}
}
cout<<dp[(1<<m)-1];//输出达到最终目标的最少次数
return 0;
}