旋转

【题目描述】
考虑下图 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];
    }
}
posted @ 2016-12-18 20:36  JRX2015U43  阅读(296)  评论(0编辑  收藏  举报