我在这里看到几个问题并不能完全回答我的问题。我试图对面试问题中经常使用的经典矩阵轮换问题进行演绎。我没有关注方阵,而是对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;
在内的多项内容,但它仍保持不变。
有人可以解释我在算法中出错的地方吗?
答案 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]]