题目链接:http://codeforces.com/contest/961/problem/C
题意:大致题意就是给你4个n*n的正方形字符数组,只包含0和1.然后需要让你对这4个做染色变换,染完之后拼成一个2n*2n的大正方形,是的正方形相邻块颜色不一样。
分析:其实就是把这4块染色,然后拼接成一个左上角为1,然后相邻块颜色不同的大正方形。(左上角为1和左上角为0是一样的情况,拆分开可以相互拼接)。我们只需要在这4个小正方形中,选2个涂成左上角为1,2个涂成左上角为0,就可以拼接成我们想要的答案。到这里就比较简单了,只需要暴力比较每一个正方形染成左上角为1和左上角为9两种情况的花费。然后暴力选取2个当做左上角为1的,剩下的染成左上角为0的花费和,就是其中的一种情况的花费。枚举所有情况取最小就可以了。
AC代码:
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 char s[5][105][105]; 6 char m[3][105][105]; 7 int ans[3][5]; 8 int main(){ 9 ios_base::sync_with_stdio(0); 10 cin.tie(0); 11 int n; 12 for(int i=1;i<=2;i++){ 13 for(int j=1;j<=100;j++){ 14 for(int k=1;k<=100;k++){ 15 if((i+j+k)%2==1){ 16 m[i][j][k]='1'; 17 } 18 else m[i][j][k]='0'; 19 } 20 } 21 } 22 memset(ans,0,sizeof(ans)); 23 cin>>n; 24 for(int i=1;i<=4;i++){ 25 for(int j=1;j<=n;j++){ 26 for(int k=1;k<=n;k++){ 27 cin>>s[i][j][k]; 28 } 29 } 30 } 31 for(int i=1;i<=2;i++){ 32 for(int j=1;j<=4;j++){ 33 for(int k=1;k<=n;k++){ 34 for(int r=1;r<=n;r++){ 35 if(s[j][k][r]!=m[i][k][r]){ 36 ans[i][j]++; 37 } 38 } 39 } 40 } 41 } 42 int result=1e6; 43 for(int i=1;i<=4;i++){ 44 for(int j=1;j<=4;j++){ 45 if(i==j) continue; 46 for(int k=1;k<=4;k++){ 47 if(i==k||j==k) continue; 48 result=min(result,ans[1][i]+ans[1][j]+ans[2][k]+ans[2][10-i-j-k]); 49 } 50 } 51 } 52 cout<<result<<endl; 53 return 0; 54 }