import java.util.*;
import java.math.BigInteger;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static long initStatus;
public static long finalStatus;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int n = in.nextInt();
int m = in.nextInt();
int planNumber = in.nextInt();
StringBuffer sb = new StringBuffer();
for(int i = 0;i < n;i++){
sb.append(in.next());
}
initStatus = new BigInteger(sb.toString(),2).longValue();
sb = new StringBuffer();
for(int i = 0;i < m*n;i++)sb.append("1");
finalStatus = new BigInteger(sb.toString(),2).longValue();
int checkStatus = 0;
long[] plans = new long[planNumber];
for(int i = 0;i < planNumber;i ++){
sb = new StringBuffer();
for(int j = 0;j < n;j++){
sb.append(in.next());
}
plans[i] = new BigInteger(sb.toString(),2).longValue();
}
if(initStatus == finalStatus){
System.out.println(0);
return;
}
String result = dfs(plans,0,0);
if(result == "false"){
System.out.println(-1);
}
else{
System.out.println(result.split(" ").length);
System.out.println(result);
}
}
public static String dfs(long[] plans,long curStatus,int curPos){
if(curPos > plans.length)return "false";
//仅有两个数字在同一位置均为1时结果不为0,表示存在冲突
if((curStatus & initStatus) != 0)return "false";
//当全覆盖,返回当前位置
if((curStatus | initStatus) == finalStatus)return "";
if(curPos == plans.length)return "false";
int min = 100;
//使用下一个计划的情况
String str = dfs(plans,curStatus | plans[curPos],curPos + 1);
if(str != "false" && str.length() < min){
min = str.length();
}
//不使用下一个计划的情况
String str1 = dfs(plans,curStatus,curPos + 1);
if(str1 != "false" && str1.length() <= min){
min = str1.length();
return str1;
}
//两种递归路径都没有可行解
if(min == 100)return "false";
return (curPos + 1) + " " + str;
}
}
提供一个Java版的位运算解答版本



京公网安备 11010502036488号