NOI题库 09:图像旋转翻转变换

 NOI题库开始的题,也是略水,当然也是大水,所以彼此彼此

09:图像旋转翻转变换
总时间限制: 1000ms 内存限制: 65536kB
描述
给定m行n列的图像各像素点灰度值,对其依次进行一系列操作后,求最终图像。
其中,可能的操作及对应字符有如下四种:
A:顺时针旋转90度;
B:逆时针旋转90度;
C:左右翻转;
D:上下翻转。
输入
第一行包含两个正整数m和n,表示图像的行数和列数,中间用单个空格隔开。1 <= m <= 100, 1 <= n <= 100。
接下来m行,每行n个整数,表示图像中每个像素点的灰度值,相邻两个数之间用单个空格隔开。灰度值范围在0到255之间。
接下来一行,包含由A、B、C、D组成的字符串s,表示需要按顺序执行的操作序列。s的长度在1到100之间。
输出
m’行,每行包含n’个整数,为最终图像各像素点的灰度值。其中m’为最终图像的行数,n’为最终图像的列数。相邻两个整数之间用单个空格隔开。
样例输入
2 3
10 0 10
100 100 10
AC
样例输出
10 100
0 100
10 10

  我只想吐槽,由于最近变量全都设为全局变量了,这次傻逼了,忘了把过程中的变量在过程中重新定义,使得多调试了好多次。。以此为鉴!

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int d[110][110]={0},d1[110][110]={0};//d1位控制变换用的
int n,m;
int i,j;
char work[200];
int k;

void A()//操作A
{
    int i,j;
    memset(d,0,sizeof(d));
    for (i=1;i<=m;i++)
        for (j=1;j<=n;j++)
                d[j][m-i+1]=d1[i][j];
    int temp=m;
    m=n;
    n=temp;
    memset(d1,0,sizeof(d1));
    for (i=1;i<=m;i++)
        for (j=1;j<=n;j++)
                d1[i][j]=d[i][j];
    //cout<<"A is right"<<endl;         
}

void B()//操作B,逆时针旋转90°就相当于顺时针旋转270°
{
    A();
    A();
    A();
    //cout<<"B is right"<<endl;     
}

void C()//操作C
{
    int i,j;
    for (i=1;i<=m;i++)
        for (j=1;j<=n;j++)
                d[i][j]=d1[i][n-j+1];
    memset(d1,0,sizeof(d1));
    for (i=1;i<=m;i++)
        for (j=1;j<=n;j++)
                d1[i][j]=d[i][j];

    //cout<<"C is right"<<endl;     
} 

void D()//操作D
{
    int i,j;
    for (i=1;i<=m;i++)
        for (j=1;j<=n;j++)
                d[i][j]=d1[m-i+1][j];
    memset(d1,0,sizeof(d1));
    for (i=1;i<=m;i++)
        for (j=1;j<=n;j++)
                d1[i][j]=d[i][j];
    //cout<<"D is right"<<endl;     
}

int main()
{
    scanf("%d%d",&m,&n);
    for (i=1;i<=m;i++)
        for (j=1;j<=n;j++)
            {
                scanf("%d",&d[i][j]);
                d1[i][j]=d[i][j];
            }
        cin>>work;
        int k=strlen(work);
        //cout<<k;
        for (i=0;i<k;i++)   
          { 
            if (work[i]=='A')
                A();
            if (work[i]=='B')
                B();
            if (work[i]=='C')
                C();
            if (work[i]=='D')
                D();
          }
    for (i=1;i<=m;i++)
        {
            for (j=1;j<=n;j++)
                printf("%d ",d[i][j]);
            printf("
");
        }
  return 0;
}    
——It's a lonely path. Don't make it any lonelier than it has to be.
原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346274.html