uvalive 11464

题意:怎么使最少的0变成1让原矩阵的每个数的上下左右之和为偶数

思路:枚举第一行就可以确定所有的状态

  1 package text;
  2 
  3 import java.awt.List;
  4 import java.io.BufferedReader;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.io.InputStreamReader;
  8 import java.io.PrintWriter;
  9 import java.math.BigDecimal;
 10 import java.math.BigInteger;
 11 import java.util.Map;
 12 import java.util.Scanner;
 13 import java.util.StringTokenizer;
 14 
 15 public class Main {
 16     public static void main(String[] args) throws IOException {
 17         InputReader cin = new InputReader(System.in);
 18         int t;
 19         int n;
 20         int cube[][] = new int[50][50];
 21         int now[][] = new int[50][50];
 22         t = cin.nextInt();
 23         for(int p = 1;p<=t;p++){
 24             int ans = -1;
 25             n = cin.nextInt();
 26             for(int i = 1;i<=n;i++)
 27                 for(int j = 1;j<=n;j++)
 28                     cube[i][j] = cin.nextInt();
 29             for(int i = 0;i<1<<n;i++) {
 30                 int tmp = i;
 31                 int tmpans = 0;
 32                 for(int j = 1;j<=n;j++) {
 33                     now[1][j] = tmp&1;
 34                     tmp/=2;
 35                 }
 36                 boolean flag = true;
 37                 for(int j = 1;j<=n;j++)
 38                     if(cube[1][j]==0&&now[1][j]==1)
 39                         tmpans++;
 40                     else if(cube[1][j]==1&&now[1][j]==0)
 41                         flag = false;
 42                 for(int j = 2;j<=n;j++)
 43                     for(int k = 1;k<=n;k++)
 44                             now[j][k] = 0;
 45                 for(int j = 2;j<=n;j++) {
 46                     for(int k = 1;k<=n;k++) {
 47                         int s = 0,nowj = j-1;
 48                         if(nowj>=2) s+=now[nowj-1][k];
 49                         if(k>=2) s+=now[nowj][k-1];
 50                         if(k<n) s+=now[nowj][k+1];
 51                         now[j][k] = s%2;
 52                         if(now[j][k]==0&&cube[j][k]==1) {
 53                             flag = false;
 54                             break;
 55                         }
 56                         if(now[j][k]==1&&cube[j][k]==0)
 57                             tmpans++;
 58                     }
 59                     if(!flag)
 60                         break;
 61                 }
 62                 if(flag&&(tmpans<ans||ans==-1))
 63                     ans = tmpans;
 64             }
 65             if(ans==-1)
 66                 System.out.printf("Case %d: -1
",p);
 67             else 
 68                 System.out.printf("Case %d: %d
",p,ans);
 69         }
 70     }
 71 }
 72 class InputReader {      
 73     public BufferedReader reader;      
 74     public StringTokenizer tokenizer;      
 75       
 76     public InputReader(InputStream stream) {      
 77         reader = new BufferedReader(new InputStreamReader(stream), 32768);      
 78         tokenizer = new StringTokenizer("");      
 79     }      
 80     
 81     
 82     private void eat(String s) {      
 83         tokenizer = new StringTokenizer(s);      
 84     }      
 85       
 86     public String nextLine() {       
 87         try {      
 88             return reader.readLine();      
 89         } catch (Exception e) {      
 90             return null;      
 91         }      
 92     }      
 93       
 94     public boolean hasNext() {      
 95         while (!tokenizer.hasMoreTokens()) {      
 96             String s = nextLine();      
 97             if (s == null)      
 98                 return false;      
 99             eat(s);      
100         }      
101         return true;      
102     }      
103       
104     public String next() {      
105         hasNext();      
106         return tokenizer.nextToken();      
107     }      
108       
109     public int nextInt() {      
110         return Integer.parseInt(next());      
111     }      
112       
113     public int[] nextInts(int n) {      
114         int[] nums = new int[n];      
115         for (int i = 0; i < n; i++) {      
116             nums[i] = nextInt();      
117         }      
118         return nums;      
119     }      
120       
121     public long nextLong() {      
122         return Long.parseLong(next());      
123     }      
124       
125     public double nextDouble() {      
126         return Double.parseDouble(next());      
127     }      
128       
129     public BigInteger nextBigInteger() {      
130         return new BigInteger(next());      
131     }      
132 }      
原文地址:https://www.cnblogs.com/Tree-dream/p/7603353.html