如何将M x N矩阵旋转180度?

时间:2016-04-03 23:52:07

标签: c++ algorithm matrix rotation

我在这里看到几个问题并不能完全回答我的问题。我试图对面试问题中经常使用的经典矩阵轮换问题进行演绎。我没有关注方阵,而是对M x N矩阵感兴趣。

输入矩阵

1 2 3
4 5 6
7 8 9
1 2 3

我想将矩阵转换为

3 2 1
9 8 7
6 5 4
3 2 1

以下是我写的代码:

#include <iostream>
#include <vector>
#include <algorithm>

void do_swaps(int& a, int& b, int& c, int& d) {
  std::swap(a, b);
  std::swap(c, d);
}

void rotate(std::vector<std::vector<int>>& v) {
  size_t m = v.size();
  size_t n = v[0].size();

  for(size_t i = 0; i < m/2; ++i) {
    for(size_t j = 0; j <= n/2; ++j) {
      do_swaps(v[i][j], v[m-i-1][n-j-1], v[m-j-1][i], v[j][n-i-1]);
    }
  }
}

void print(const std::vector<std::vector<int>>& v) {
  size_t m = v.size();
  size_t n = v[0].size();

  for(size_t i = 0; i < m; ++i) {
    for(size_t j = 0; j < n; ++j) {
      std::cout << v[i][j] << ' ';
    }
    std::cout << '\n';
  }
}


int main() {
  std::vector<std::vector<int>> m{{1,2,3}, {4,5,6}, {7,8,9}, {1, 2, 3}};
  std::cout << "Before: \n";
  print(m);
  rotate(m);
  std::cout << "\nAfter: \n";
  print(m);
}

这是我的输出:

Before: 
1 2 3 
4 5 6 
7 8 9 
1 2 3 

After: 
3 2 1 
9 5 7 
6 8 4 
3 2 1 

我的代码适用于3 x 3矩阵(避免测试更高维的矩阵),但我的代码中似乎有一个错误,导致最内层元素保持未被填充。

for(size_t j = 0; j <= n/2; ++j) {行中,我尝试将停止条件调整为包括j < (n+1)/2;j < (n-1)/2;在内的多项内容,但它仍保持不变。

有人可以解释我在算法中出错的地方吗?

3 个答案:

答案 0 :(得分:2)

如果行号为奇数,则不要处理中间行。

此外,您交换位于中间列上的元素(当列号为奇数时)两次。您可以使用按位和1来检查m是否为奇数。

以上是一种更简单的项目交换值的方法,在这种情况下您甚至不必关心中间列。

void rotate(std::vector<std::vector<int>>& v) {
    size_t m = v.size();
    size_t n = v[0].size();

    for (size_t i = 0; i < m / 2; ++i)
    {
        for (size_t j = 0; j < n; ++j)
            std::swap(v[i][j], v[m - i - 1][n - j - 1]);
    }
    if (m&1)
    for (size_t i = 0; i< n/2; ++i)
        std::swap(v[m/2][i], v[m/2][n-i-1]);
}

答案 1 :(得分:1)

我会使用镜像x 然后镜像y ,反之亦然。对于任何分辨率(偶数/奇数),它都是就地且安全的。因此,首先交换所有行,然后交换所有列(反之亦然)。这里有一些代码。

<?php

class Database {

public function getConnection() {
    $result = false;
    try {
        $result = new PDO('mysql:host=localhost;dbname=demo', 'root', '');
    } catch(PDOException $e) { }
    return $result;
}
}
$db = new Database();
$conn = $db->getConnection();
if (!$conn) {
die("Error connecting to the database");
}

?>

答案 2 :(得分:1)

一种诡异的方式(不到位):

d = (1, 2, 3), (4, 5, 6), (7, 8, 9), (1, 2, 3)

[r[::-1] for r in d[::-1]]