学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
给定一个
n
×
n
n\times n
n×n的正方形网格, 每个单元格只包含
0
0
0或
1
1
1。
可以对正方形网格进行任意次操作,每次操作可以修改某一个的单元格的值,即将
1
1
1修改为
0
0
0或将
0
0
0修改为
1
1
1。
小猴现在想要把正方形网格顺时针旋转
90
°
90\degree
90°、
180
°
180\degree
180°和
270
°
270\degree
270°得到的三个正方形网格都与原正方形网格相同,请问最少需要多少次操作。
【输入】
第一行,一个整数
n
n
n;
接下来
n
n
n,每行包含
n
n
n个数字
a
i
,
j
(
0
≤
a
i
,
j
≤
1
)
a_{i,j}(0\le a_{i,j}\le 1)
ai,j(0≤ai,j≤1)。
【输出】
一行,一个整数,表示结果。
【输入样例】
3
010
110
010
【输出样例】
1
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, a[3005][3005];
int main()
{
cin >> n;
for (int i=1; i<=n; i++) { // 输入网格
for (int j=1; j<=n; j++) {
scanf("%1d", &a[i][j]);
}
}
int ans = 0;
for (int i=1; i<=(n+1)/2; i++) { // 对于奇数,如5,需要修改到3行2列
for (int j=1; j<=n/2; j++) { // 偶数的话,只要修改到一半就可以了
int t = a[i][j]+a[j][n-i+1]+a[n-i+1][n-j+1]+a[n-j+1][i]; // 将旋转后的4个点的数字相加
ans += min(t - 0, 4 - t); //减0得到全修改为0的次数,4减表示全修改为1的次数,取最小值,加到ans中
}
}
cout << ans << endl; // 输出结果
return 0;
}
【运行结果】
5
11100
11011
01011
10011
11000
9