我发现一个有趣的问题,要求将NxN矩阵旋转90度.我在C中的递归解决方案如下.但是当我查找其他解决方案时,大多数都使用嵌套for循环来完成任务(这似乎工作正常).嵌套循环实现似乎及时运行O(n^2).
请参阅: 如何旋转二维数组?
我相信递归解决方案也会运行O( (n^2-n)/2 ),也是O(n^2)如此.我的问题是双重的.1)我的复杂性分析是否适用于递归和非递归解决方案,以及2)是否有一些高效或巧妙的方法来旋转我没有找到的矩阵?
TIA.
#include <stdio.h>
#include <stdlib.h>
int SIZE = 0;
/**
* In-place, recursive, clockwise, 90 degree matrix rotation.
*/
static void rotate_in_place( int matrix[][SIZE], int n )
{
if( n < 2 )
return;
int temp1, temp2;
for( int i = 0; i < (n-1); i++ )
{
temp1 = matrix[i][n-1];
matrix[i][n-1] = matrix[0][i];
temp2 = matrix[n-1][n-i-1];
matrix[n-1][n-i-1] = temp1;
temp1 = matrix[n-i-1][0];
matrix[n-i-1][0] = temp2; …Run Code Online (Sandbox Code Playgroud) 我该如何旋转矩阵
|3 4 5 6 8|
|5 4 3 2 6|
|3 3 7 8 9|
Run Code Online (Sandbox Code Playgroud)
至
|8 6 9|
|6 2 8|
|5 3 7|
|4 4 3|
|3 5 3|
Run Code Online (Sandbox Code Playgroud)
因为我见过的所有算法都是N*N矩阵.
我有一个txt,包括以下格式的一些数据.
AYGA:GKA:GOROKA:GOROKA:PAPUA NEW GUINEA:06:04:54:S:145:23:30:E:5282
AYLA:LAE::LAE:PAPUA NEW GUINEA:00:00:00:U:00:00:00:U:0000
AYMD:MAG:MADANG:MADANG:PAPUA NEW GUINEA:05:12:25:S:145:47:19:E:0020
Run Code Online (Sandbox Code Playgroud)
如何分隔用冒号(":")区分的每个项目以及如何将每个部分加载到数组中,如下例所示?
var array1 = ["AYGA", "AYLA", "AYMD"]
var array2 = ["GKA", "LAE", "MAG"]
var array3 = ["GOROKA", "", "MADANG"]
var array4 = ["GOROKA", "LAE", "MADANG"]
var array5 = ["PAPUA NEW GUINEA", "PAPUA NEW GUINEA", "PAPUA NEW GUINEA"]
var array6 = ["06", "00", "05"]
var array7 = ["04", "00", "12"]
var array8 = ["54", "00", "25"]
var array9 = ["S", "U", "S"]
var array10 = ["145", "00", "145"]
var array11 = …Run Code Online (Sandbox Code Playgroud) 我想使用Perl和PDL来实现3x3矩阵的旋转(如果可能的话)
即原始矩阵
[ 1, 2, 3 ]
[ 4, 5, 6 ]
[ 7, 8, 9 ]
Run Code Online (Sandbox Code Playgroud)
我想旋转,大约5,所以它成为新的矩阵
[ 3, 6, 9 ]
[ 2, 5, 8 ]
[ 1, 4, 7 ]
Run Code Online (Sandbox Code Playgroud)
实际上这和你如何旋转二维数组相同?但我想使用Perl和PDL.
感谢您的帮助.
假设我有一个以0°旋转存储的数组:
0 0 1 0 0
0 0 1 0 0
1 1 1 0 0
0 0 0 0 0
0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
如果我通过,我希望它以良好的近似值返回,例如30°作为参数,它将是这样的:
0 0 0 1 0
1 1 0 1 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
45°会
1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
我知道90°旋转的解决方案.但我不认为这会对我有帮助吗? …
我正在解决一个更大的问题,一步我需要逆时针旋转一个二维阵列.
所以,如果我有这个矩阵:
1 2 3 4
1 2 3 4
3 4 5 6
3 4 5 6
Run Code Online (Sandbox Code Playgroud)
轮换后它将是:
4 4 6 6
3 3 5 5
2 2 4 4
1 1 3 3
Run Code Online (Sandbox Code Playgroud)
我找到了顺时针旋转它的解决方案:
<?php
$a = array(array(1,2,3,4),array(5,6,7,8),array(9,0,1,2),array(3,4,5,6));
$b = array(); //result
while(count($a)>0)
{
$b[count($a[0])-1][] = array_shift($a[0]);
if (count($a[0])==0)
{
array_shift($a);
}
}
?>
Run Code Online (Sandbox Code Playgroud)
问题是,即使a是单维或只有一个元素,它也必须工作.
所以,1 2 3 4将成为:
4
3
2
1
Run Code Online (Sandbox Code Playgroud) 我需要做一个这样做的程序:给定一个图像(5*5像素),我必须搜索有多少图像存在于另一个图像中,由许多其他图像组成.也就是说,我需要搜索图像中的给定图案.
要使用的语言是C.我必须使用并行计算来搜索4个角度(0º,90º,180º和270º).
最好的方法是什么?
[解决了]
这个问题的标题含糊不清,但希望这能解决问题。
基本上,我正在寻找的是旋转这组数据的解决方案。此数据以特定方式设置。
以下是输入和输出的示例:
输入:
3
987
654
321
Run Code Online (Sandbox Code Playgroud)
输出:
123
456
789
Run Code Online (Sandbox Code Playgroud)
“3”表示将使用的列数和行数。如果您输入数字“4”,您将被允许输入 4 组 4 个整数。
输入:
4
4567
3456
2345
1234
Run Code Online (Sandbox Code Playgroud)
输出:
1234
2345
3456
4567
Run Code Online (Sandbox Code Playgroud)
目标是找到一种仅在需要时旋转数据的方法。您必须确保最小的角数位于左上角。例如,对于上面的代码,您旋转了它,因此 1 位于左上角。
我的问题是我不知道如何旋转数据。我只能旋转角落而不能旋转侧面。这是我的代码到目前为止所做的:
我只是不知道如何比较这些字符并最终旋转数据。
任何帮助,将不胜感激!任何问题都会得到解答。
问题的详细描述在这里(问题 J4)。这只是我为明年比赛分配给自己的一个挑战,所以给我答案不会“破坏”问题,而是帮助我学习。
到目前为止,这是我的代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int max = kb.nextInt();
int maxSqrt = (max * max);
int num[] = new int[max];
String num_string[] = new String[max]; …Run Code Online (Sandbox Code Playgroud)