首页 > 解决方案 > 将给定矩阵旋转 K 次

问题描述

K时间旋转矩阵意味着将给定N*N矩阵的列向右移动K位置。
例如,考虑一个3*3必须旋转的矩阵。

输入:

n = 3;
k = 2;

旋转前的矩阵:

10  20  30
40  50  60
70  80  90

预期输出:

20  30  10
50  60  40
80  90  70

实际输出:

Segmentation fault (core dumped)

我不知道哪里弄错了。请整理一下。:(
以下是我的尝试。

#include <stdio.h>

int main()
{
    int n,i,j,k,temp=0;
    scanf("%d",&n);
    int arr[n][n];
    for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
         scanf("%d",&arr[i][j]);
       }
    }
    scanf("%d",&k);
  
    for(int l=1;l<=k;l++){
    temp=arr[i][0];
    for(int i=0;i<n;i++){
        for(int j=1;j<n-1;j++){
            arr[i][j]=arr[i][j+1];
        }
    }
    arr[i][j]=temp;
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            printf("%d",arr[i][j]);
        }
        
    }
    
    return 0;
}

标签: c

解决方案


解决方案

#include <stdio.h>

int main ()
{
    int n = 0, k = 0;
    
    while(n > 100 || n <= 0)//to prevent absurd values. Adjust as required
    {
        printf ("Enter length of matrix: ");
        scanf ("%d", &n);
    }
    printf ("Enter shift times: ");
    scanf ("%d", &k);
    k = k % n;//get rid of excess shifts
    k = n - k;//convert shift direction (right to left)
    int arr[n][n];
    printf ("Enter elements of matrix:\n");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            scanf ("%d", &arr[i][j]);//populates the matrix
        }
    }
    
    int temp[n][k];//for storing part of matrix while swapping
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < k; j++)
        {
            temp[i][j] = arr[i][j];//stores part of matrix
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = k; j < n; j++)
        {
            arr[i][j - k] = arr[i][j];//moves remaining part of matrix
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = n - k; j < n; j++)
        {
            arr[i][j] = temp[i][j - (n - k)];//places stored part in position
        }
    }
    
    printf ("The matrix:\n");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf ("%d\t", arr[i][j]);//prints the matrix
        }
        printf("\n");
    }
    
    return 0;
}

说明

你有没有想过如果 的值k大于会发生什么i
该行k = k % n处理它。它将右移次数更改为所需的最小右移次数。

该行将k = n - k右移次数更改为等量的左移次数。k这是必需的,因为我们的代码将矩阵按列左移。
为什么?因为我想让它这样做。

请注意,语句后面的代码int temp[n][k];与我们编写的使用第三个交换两个变量的代码非常相似。

temp = a;
a = b;
b = temp;

最后,我们打印我们的矩阵。

笔记:

该程序的编写方式易于阅读和理解。它尚未针对性能进行优化。


推荐阅读