图片旋转(Java)

写在所有的前面:

本文采用Java实现代码

题目说明

题目:整数旋转

题目出处

pta
《面向对象程序设计》老师留的实验题

题目描述Description

二维图片由一个个像素点组成,目前灰度图像使用一个0-255之间的整数表示某个像素点的像素值。编程完成图片旋转控制程序。
本题目要求读入2个整数m和n(<=20),作为图片的长宽尺寸。输入1个整数r,作为旋转角度(只能输入90 180 -90中的一个,90表示图形向左旋转90度,-90表示图形向右旋转90度)。然后按照行列输入图片像素值,

输入Input

第一行:2个整数m和n(<=20)
第二行:2个整数r(只能是90 180 -90中的一个,否则提示:angle data error
第三行以后:输入m行n列的整数数据,必须在0-255之间,否则提示:matrix data error
以上输入的都是整数,若有非整数的数据输入,统一提示:data type error

输出Output

按要求旋转后的图片矩阵数据

样例Sample

输入:

3 4
90
1 2 3 4
5 6 7 8
9 10 11 12

输出:

4 8 12
3 7 11
2 6 10
1 5 9

限制Hint

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB

解答说明

方案1:输入时旋转

解题思路

在输出时通过调整参数,输出旋转后该位置的数字

一般情况

输入m、n和数组
根据输入的角度调用输出数组
判断三个判断条件,如果不符合要接return退出main方法

特殊情况

判断输入类型:sc.hasNextInt()

if (!sc.hasNextInt())
{
	System.out.println("data type error");
}
else
{
//正常输入
}

详情可见:祈望每天自然醒《Java基础 - 判断用户输入的类型Scanner类的hasNextInt(),hasNextFloat()…方法》
https://blog.csdn.net/yeahPeng11/article/details/114900049

代码实现

import java.util.Scanner;

public class Main
{
    //main方法
    public static void main(String[] args)
    {
        //加载Scanner类
        Scanner sc = new Scanner(System.in);
        //输入m、n
        int m = sc.nextInt(), n = sc.nextInt();
        //定义矩阵
        int[][] a = new int[m][n];
        //输入旋转度数
        int r = sc.nextInt();
        //角度错误判断
        if (r != 90 && r != -90 && r != 180)
        {
            System.out.println("angle data error");
            return;
        }
        //输入数组
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                //数据类型判断
                if (!sc.hasNextInt())
                {
                    System.out.println("data type error");
                    return;
                }
                else
                {
                    a[i][j] = sc.nextInt();
                    //数据区间为0~255判断
                    if (a[i][j] < 0 || a[i][j] > 255)
                    {
                        System.out.println("matrix data error");
                        return;
                    }
                }
        //旋转90度
        if (r == 90) pprint90(m, n, a);
            //旋转-90度
        else if (r == -90) pprint270(m, n, a);
            //旋转180度
        else if (r == 180) pprint180(m, n, a);

    }

    //旋转-90度
    static void pprint270(int m, int n, int[][] a)
    {
        //列从左向右
        for (int i = 0; i < n; i++)
        {
            //行从下到上
            for (int j = m - 1; j >= 0; j--)
            {
                System.out.print(a[j][i]);
                if (j != 0) System.out.print(" ");
            }
            System.out.println();
        }
    }

    //旋转90度
    static void pprint90(int m, int n, int[][] a)
    {
        //列从右向左
        for (int i = n - 1; i >= 0; i--)
        {
            //行从上到下
            for (int j = 0; j < m; j++)
            {
                System.out.print(a[j][i]);
                if (j != m - 1) System.out.print(" ");
            }
            System.out.println();
        }
    }

    //旋转180度
    static void pprint180(int m, int n, int[][] a)
    {
        //行从下到上
        for (int i = m - 1; i >= 0; i--)
        {
            //列从右到左
            for (int j = n - 1; j >= 0; j--)
            {
                System.out.print(a[i][j]);
                if (j != 0) System.out.print(" ");
            }
            System.out.println();
        }
    }
}

其他解释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值