题解 P6450 【[COCI2008-2009#4] ROT】

· · 题解

这道题目直接按照题目说的模拟就行了

k=0时

damir
marko
darko

damir
marko
darko
for(int i=1;i<=r;i++)//循环每一行
{
    for(int j=1;j<=c;j++)//循环每一列
    {
        cout<<m[i][j];//输出答案
    }
    cout<<endl;//下一行
}

k=45时

damir
marko
darko

  d
 m a
d a m
 a r i
  r k r
   k o
    o
for(int i=1;i<=r+c-1;i++)//输出有行加列减一行
{
    for(int a=1;a<=abs(r-i);a++)//列数减去输出的行数的绝对值是这行前面的空格数
    {
        cout<<' ';//输出空格
    }
    for(int a=r;a>=1;a--)//先输出行坐标大的所以从后往前
    {
        for(int b=c;b>=1;b--)//从后往前
        {
            if(a+b==i+1)//如果行加上列是输出的行数减一那么这个数就在这一行
            {
                cout<<m[a][b]<<' ';//输出
            }
        }
    }
    cout<<endl;//下一行
}

k=90时

damir
marko
darko

dmd
aaa
rrm
kki
oor
for(int i=1;i<=c;i++)//先输出最前面那个数,输出的行数有和输入的列数一样多
{
    for(int j=r;j>=1;j--)//先输出最后那个数,输出的列数有和输入的行数一样多
    {
        cout<<m[j][i];//输出答案
    }
    cout<<endl;//下一行
}

k=135时

damir
marko
darko

    d 
   a m 
  r a d 
 k r a 
o k m 
 o i 
  r 
for(int i=1;i<=r+c-1;i++)//输出有行加列减一行
{
    for(int a=1;a<=abs(c-i);a++)//列减去输出的行数的绝对值是这行前面的空格数
    {
        cout<<' ';//输出空格
    }
    for(int a=r;a>=1;a--)//因为先输出行坐标大的所以从后往前
    {
        for(int b=1;b<=c;b++)//从前往后
        {
            if(r-a+b==i)//如果符合输出要求
            {
                cout<<m[a][b]<<' ';//输出答案
            }
        }
    }
    cout<<endl;//下一行
}

k=180时

damir
marko
darko

okrad
okram
rimad
for(int a=r;a>=1;a--)//从最后一行往前输出
{
    for(int b=c;b>=1;b--)//从最后一列往前输出
    {
        cout<<m[a][b];//输出答案
    }
    cout<<endl;//下一行
}

k=225时

damir
marko
darko

  o 
 o k 
r k r 
 i r a 
  m a d 
   a m 
    d 
for(int i=1;i<=r+c-1;i++)//输出有长加宽减一行
{
    for(int a=1;a<=abs(r-i);a++)//长减去输出行数的绝对值是这行前面的空格数
    {
        cout<<' ';//输出空格
    }
    for(int a=1;a<=r;a++)//因为先输出行坐标小的所以从前往后
    {
        for(int b=1;b<=c;b++)//从前往后
        {
            if(r-a+c-b==i-1)//如果符合要求
            {
                cout<<m[a][b]<<' ';//输出答案
            }
        }
    }
    cout<<endl;//下一行
}

k=270时

damir
marko
darko

roo
ikk
mrr
aaa
dmd
for(int a=c;a>=1;a--)//先输出最后面那个数,输出的行数有和输入的列数一样多
{
    for(int b=1;b<=r;b++)//先输出最前面那个数,输出的列数有和输入的行数一样多
    {
        cout<<m[b][a];//输出答案
    }
    cout<<endl;//下一行
}

k=315时

damir
marko
darko

    r 
   i o 
  m k o 
 a r k 
d a r 
 m a 
  d 
for(int i=1;i<=r+c-1;i++)//输出有行加列减一行
{
    for(int a=1;a<=abs(c-i);a++)//列减去输出的行数的绝对值是这行前面的空格数
    {
        cout<<' ';//输出空格
    }
    for(int a=1;a<=r;a++)//因为先输出行坐标小的所以从后往前
    {
        for(int b=c;b>=1;b--)//从后往前
        {
            if(a+c-b==i)//如果符合要求
            {
                cout<<m[a][b]<<' ';//输出答案
            }
        }
    }
    cout<<endl;//下一行
}

代码:

#include <bits/stdc++.h>//头文件
using namespace std;
int main()//主函数
{
    int r,c,k;//行列和度数
    char m[11][11];//图形
    cin>>r>>c;//输入行列
    for(int i=1;i<=r;i++)//有r行输入
    {
        for(int j=1;j<=c;j++)//有c列输入
        {
            cin>>m[i][j];//输入图形
        }
    }
    cin>>k;//输入度数
    k%=360;//取余数,保证大于315的度数正确
    if(k==0)
    {
        for(int i=1;i<=r;i++)
        {
            for(int j=1;j<=c;j++)
            {
                cout<<m[i][j];
            }
            cout<<endl;
        }
    }
    if(k==45)
    {
        for(int i=1;i<=r+c-1;i++)
        {
            for(int a=1;a<=abs(r-i);a++)
            {
                cout<<' ';
            }
            for(int a=r;a>=1;a--)
            {
                for(int b=c;b>=1;b--)
                {
                    if(a+b==i+1)
                    {
                        cout<<m[a][b]<<' ';
                    }
                }
            }
            cout<<endl;
        }
    }
    if(k==90)
    {
        for(int i=1;i<=c;i++)
        {
            for(int j=r;j>=1;j--)
            {
                cout<<m[j][i];
            }
            cout<<endl;
        }
    }
    if(k==135)
    {
        for(int i=1;i<=r+c-1;i++)
        {
            for(int a=1;a<=abs(c-i);a++)
            {
                cout<<' ';
            }
            for(int a=r;a>=1;a--)
            {
                for(int b=1;b<=c;b++)
                {
                    if(r-a+b==i)
                    {
                        cout<<m[a][b]<<' ';
                    }
                }
            }
            cout<<endl;
        }
    }
    if(k==180)
    {
        for(int a=r;a>=1;a--)
        {
            for(int b=c;b>=1;b--)
            {
                cout<<m[a][b];
            }
            cout<<endl;
        }
    }
    if(k==225)
    {
        for(int i=1;i<=r+c-1;i++)
        {
            for(int a=1;a<=abs(r-i);a++)
            {
                cout<<' ';
            }
            for(int a=1;a<=r;a++)
            {
                for(int b=1;b<=c;b++)
                {
                    if(r-a+c-b==i-1)
                    {
                        cout<<m[a][b]<<' ';
                    }
                }
            }
            cout<<endl;
        }
    }
    if(k==270)
    {
        for(int a=c;a>=1;a--)
        {
            for(int b=1;b<=r;b++)
            {
                cout<<m[b][a];
            }
            cout<<endl;
        }
    }
    if(k==315)
    {
        for(int i=1;i<=r+c-1;i++)
        {
            for(int a=1;a<=abs(c-i);a++)
            {
                cout<<' ';
            }
            for(int a=1;a<=r;a++)
            {
                for(int b=c;b>=1;b--)
                {
                    if(a+c-b==i)
                    {
                        cout<<m[a][b]<<' ';
                    }
                }
            }
            cout<<endl;
        }
    }
    return 0;//别忘了
} 

感谢:

感谢管理审核!

感谢大家观赏!