题目链接:点击打开链接
题目大意:给四个n*n的正方形矩阵,里面的数只有0和1,可以把它们任意组合成一个2n*2n的正方形(只能平移,不能旋转、翻转),你要改变其中的数,让正方形中的任意元素上下左右的元素都不与其相同,输出最小的改变次数。
解题思路:用一个in数组保存输入的四个正方形,用一个cur数组保存大正方形,从所有情况中选出需要改变最少的就是ans。
注:可以用next_permutation来改变排列,这样就不需要依次枚举了。
代码:
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<string> #include<map> #include<vector> #include<iomanip> #define FAST ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) typedef long long ll; const int INF = 0x3f3f3f3f; using namespace std; char in[4][105][105]; char cur[205][205]; int u[4]; int main() { FAST; int n; scanf("%d", &n); for(int i = 0; i < 4; i++) for(int j = 0; j < n; j++) scanf("%s", in[i][j]); for(int i = 0; i < 4; i++) u[i] = i; int ans = INF; do{ for(int i = 0; i < 4; i++){ for(int j = 0; j < n; j++) for(int k = 0; k < n; k++) cur[(i / 2)*n + j][(i % 2)*n + k] = in[u[i]][j][k];//精华代码! } int cnt = 0; for(int i = 0; i < 2 * n; i++){ for(int j = 0; j < 2 * n; j++){ char c = '0' + (i + j) % 2; if (c != cur[i][j]) cnt++; } } ans = min(ans, cnt); }while(next_permutation(u, u + 4)); return printf("%d\n", ans), 0; }