codeforces 961C Chessboard

题目链接: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 }
View Code
原文地址:https://www.cnblogs.com/ls961006/p/8782586.html