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版的位运算解答版本