题目描述
某种食品由k种原料组成(1≤k≤16),每种原料的编号为1,2,3,…,k。同时有n个人(1≤n≤1000),每个人对食品中的原料有一定的要求。全部的要求是一个n×k的矩阵。
复制a[1,1] a[1,2] a[1,3] ... a[1,k]
a[2,1] a[2,2] a[2,3] ... a[2,k]
...
a[n,1] a[n,2] a[n,3] ... a[n,k]
a[i,j] =1,表示第i个人对第j种原料要求一定要有。
a[i,j] =2,表示第i个人对第j种原料要求一定不能有。
a[i,j] =0,表示第i个人对第j种原料要求可有可无。
那么,当n,k和要求矩阵给出之后,求出所有符合要求的食品方案数。若不可能,则输出-1。
输入格式
第一行2个整数n和k,接下来n行,每行k个数据,每个数据分别为0,1或2,表示要求矩阵。
输出格式
一个整数,表示所有符合要求的食品方案数,如不可能,输出-1。
样例
样例输入
复制2 3
1 0 1
0 0 1
样例输出
复制2
数据范围与提示
样例输入输出解释:
即食品的三种原料为有,有,有或有,无,有均可,故有2种方案。
_____________________________________________________________________________
写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
_____________________________________________________________________________
#include <bits/stdc++.h>
using namespace std;
int n,m,ans=1;
int a[10005][10005],b[10005];//b标记一下每一份原料顾客的需要状态
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]+b[j]==3){//一个是1一个是2加起来是3就代表矛盾输出
cout<<"-1";
return 0;
}
if(b[j]==0)b[j]=a[i][j];//注意这里需要判断一下才能改状态,不然原本是1或2结果改成0
}
}
for(int i=1;i<=m;i++){//小学奥数求总方案数
if(b[i]==0)ans*=2;
}
cout<<ans;
}