1886. Determine Whether Matrix Can Be Obtained By Rotation

Given two n x n binary matrices mat and target, return true if it is possible to make mat equal to target by rotating mat in 90-degree increments, or false otherwise.

 

Example 1:

Input: mat = [[0,1],[1,0]], target = [[1,0],[0,1]]
Output: true
Explanation: We can rotate mat 90 degrees clockwise to make mat equal target.

Example 2:

Input: mat = [[0,1],[1,1]], target = [[1,0],[0,1]]
Output: false
Explanation: It is impossible to make mat equal to target by rotating mat.

Example 3:

Input: mat = [[0,0,0],[0,1,0],[1,1,1]], target = [[1,1,1],[0,1,0],[0,0,0]]
Output: true
Explanation: We can rotate mat 90 degrees clockwise two times to make mat equal target.

 

Constraints:

  • n == mat.length == target.length
  • n == mat[i].length == target[i].length
  • 1 <= n <= 10
  • mat[i][j] and target[i][j] are either 0 or 1.

1886. Determine Whether Matrix Can Be Obtained By Rotation
struct Solution;

trait Rotation {
    fn rotate(self) -> Vec<Vec<i32>>;
}

impl Rotation for Vec<Vec<i32>> {
    fn rotate(self) -> Vec<Vec<i32>> {
        let n = self.len();
        let mut mat: Vec<Vec<i32>> = vec![vec![0; n]; n];
        for i in 0..n {
            for j in 0..n {
                mat[j][n - 1 - i] = self[i][j];
            }
        }
        mat
    }
}

impl Solution {
    fn find_rotation(mat: Vec<Vec<i32>>, target: Vec<Vec<i32>>) -> bool {
        if mat == target {
            return true;
        }
        let mat90 = mat.rotate();
        if mat90 == target {
            return true;
        }
        let mat180 = mat90.rotate();
        if mat180 == target {
            return true;
        }
        let mat270 = mat180.rotate();
        if mat270 == target {
            return true;
        }
        false
    }
}

#[test]
fn test() {
    let mat = vec_vec_i32![[0, 1], [1, 0]];
    let target = vec_vec_i32![[1, 0], [0, 1]];
    let res = true;
    assert_eq!(Solution::find_rotation(mat, target), res);
    let mat = vec_vec_i32![[0, 1], [1, 1]];
    let target = vec_vec_i32![[1, 0], [0, 1]];
    let res = false;
    assert_eq!(Solution::find_rotation(mat, target), res);
    let mat = vec_vec_i32![[0, 0, 0], [0, 1, 0], [1, 1, 1]];
    let target = vec_vec_i32![[1, 1, 1], [0, 1, 0], [0, 0, 0]];
    let res = true;
    assert_eq!(Solution::find_rotation(mat, target), res);
}