【题目描述】
考虑下图 1 的一个由 5*5 的正方形(每个单元格是一个小正方形),其中有 7 个单元格被填充成了黑色,而其余没有填充颜色。
将这个正方形顺时针旋转 90 度,然后叠加在原始图 1 之上得到新正方形图 2(含 13 个黑色格子):
原始图 1 在第 1 次旋转的基础上再顺时针旋转 90 度,叠加到图 2 之上,得到图 3 所示的正方形(含有 19 个黑色格子):
原始图 1 在第 2 次旋转的基础上再顺时针旋转 90 度,叠加到图 3 之上,得到图 4 所示的正方形(含有 25 个黑色格子):
【输入格式】
输入文件仅包含N+1行。
第一行一个整数N(1≤N≤25)。
接下来N行,每行N个“0”或“1”构成的序列,表示正方形的初始状态。其中“0”表示此处的小正方形式没有填充颜色的,“1”表示此处正方形已经是黑色填充了。
【输出格式】
输出文件共四行。每行包含一个整数,分别表示每次叠加后N*N正方形中黑色格子的数量(其中第一行为原始图中黑色格子的数量)。
【样例输入】
5
10100
10001
01100
01000
00000
【样例输出】
7
13
19
25
【分析】
数据范围令人皆大欢喜。
模拟,几乎没什么要注意的细节。
#include<iostream>
#include<string>
using namespace std;
int a[30][30],b[30][30],c[30][30];
int n;
void sum(){
int s=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (a[i][j]==1) s++;
cout<<s<<endl;
}
int main(){
cin>>n;
char ch;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++){
cin>>ch;
if (ch=='1') a[i][j]=1; else a[i][j]=0;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
b[i][j]=a[i][j];
sum();
for (int t=1;t<4;t++){
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
c[i][j]=b[j][n-i+1];
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (c[i][j]==1) a[i][j]=1;
sum();
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
b[i][j]=c[i][j];
}
}